0

我正在尝试编写我们的 httpService,它应该有一个 post 方法来检查是否存在带有 auth 令牌的 cookie,如果存在,那么它应该附加 auth 标头并发出 post 请求。

但是,如果 cookie 不存在,我需要加载一个包含令牌的本地 json 文件并使用它来创建 cookie,然后附加 auth 标头并发出 post 请求。

我遇到的问题是,如果 cookie 不存在,我需要让 observable 等待另一个 observable。我曾认为解决方案是使用 switchMap,但这与 .subscribe 并不能很好地配合使用,而 .subscribe 是 http.post 请求初始化所必需的。

  private makePostRequest(address: string, payload: any, callback: any): Observable<any> {
    return this.http.post(address, payload, { headers: this.headers })
      .map(callback)
      .catch(( error: any ) => this.handleError(error));
  }

  public post(address: string, payload: any, callback: any): Observable<any>     {
       if (this.hasOAuth2()) {
         this.appendHeader(this.cookieService.get('oauth2'));
         return this.makePostRequest(address, payload, callback);
       } else if (this.isLocalhost()) {
         return this.setAuthCookie()
           .switchMap(() => this.makePostRequest(address, payload, callback));
       } else {
         return this.handleError('Could not locate oauth2 cookie');
       }
  }

  private setAuthCookie(): Observable<any> {
    return this.http.get('./json/token.json')
      .map((res: Response) => {
        let oauth2: any = res.json();
        this.cookieService.set('oauth2', oauth2.access_token, oauth2.expiration);
        this.appendHeader(oauth2.access_token);
      })
      .catch((error: any) => {
        console.log('No dev token was found', error);
        return Observable.throw(error);
      });
  }

更新:这变得奇怪的是,或多或少确切的游戏代码可以在获取请求中正常工作。

  private makeGetRequest(address: string, callback: any): Observable<any> {
    return this.http.get(address, { headers: this.headers })
      .map(callback)
      .catch(( error: any ) => this.handleError(error));
  }

  public get(address: string, callback: any): Observable<any> {
      if (this.hasOAuth2()) {
        this.appendHeader(this.cookieService.get('oauth2'));
        return this.makeGetRequest(address, callback);
      } else if (this.isLocalhost()) {
        return this.setAuthCookie()
          .switchMap(() => this.makeGetRequest(address, callback));
      } else {
        return this.handleError('Could not locate oauth2 cookie');
      }
  }

解决方案:我没有订阅 httpService.post 可观察对象,因此它从未被初始化。

4

2 回答 2

0

.subscribe()在第二个案例中添加一个空:

return this.setAuthCookie()
          .map(() => { })
          .switchMap(() => { // I need to switchMap due to the http.get request in the setAuthCookie method
            this.makePostRequest(address, payload, callback).subscribe(); // Again I need this or the post request won't be made
          }).subscribe(); // <--- here

它将激活 http 调用。

于 2016-10-27T00:24:24.070 回答
0

我从未订阅过我的 httpService.post 可观察对象,因此它从未被初始化。添加后来的订阅调用导致它被错误地初始化。

于 2016-10-27T01:49:05.407 回答