0

httpService を記述しようとしています。認証トークンを含む Cookie が存在するかどうかを確認するポスト メソッドが必要です。存在する場合は、認証ヘッダーを追加してポスト リクエストを行う必要があります。

ただし、Cookie が存在しない場合は、トークンを含むローカル json ファイルを読み込み、それを使用して Cookie を作成し、認証ヘッダーを追加して投稿要求を行う必要があります。

私が抱えている問題は、Cookie が存在しない場合、オブザーバブルを別のオブザーバブルを待機させる必要があることです。解決策はswitchMapを使用することだと思っていましたが、http.postリクエストを初期化するために必要な.subscribeではうまくいきません。

  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);
      });
  }

更新: これが奇妙になるのは、多かれ少なかれ正確なゲーム コードが get 要求で正しく動作することです。

  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

2 番目のケースに空.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 に答える