2016-11-01 22 views
0

retryWhenから関数を実行しようとしていますが、retryWhenが終了したときにその呼び出し親関数の後に実行しようとしています。どうやってやるの?retryWhenからparent関数を呼び出す方法angular2

getStatuses(statusesType: string[]): Observable<IStatus[]> { 

     let body = JSON.stringify({ "StatusesType": statusesType}); 
     let headers = new Headers({ 'Content-Type': 'application/json' }); 
     headers.append('Authorization', 'Bearer ' + localStorage.getItem("access_token"); 
     headers.append('Access-Control-Allow-Origin', '*'); 
     let options = new RequestOptions({ headers: headers }); 

     return this.http.post(this._baseUrl + '/statuses/statusesList', body, options) 
      .retryWhen(error => this.refreshToken()) 
      .map((res: Response) => { 
       this.statusesrecieved = res.json(); 
       return this.inspections; 
      }); 
    } 

retryWhenでrefreshToken()を実行した後、getStatuses()関数を再度呼び出す必要があります。

私はまた、このように再試行していますが、どちらも動作しませんでした。

return this.http.post(this._baseUrl + '/statuses/statusesList', body, options) 
       .retryWhen(error => this.refreshToken()) 
       .map((res: Response) => { 
        this.statusesrecieved = res.json(); 
        return this.inspections; 
       }).retry(5); 
     } 

は、ここに私のrefreshToken機能

refreshToken(): Observable<any> { 
     console.log("refreshing token"); 

     let body: string = 'grant_type=refresh_token&refresh_token=' + localStorage.getItem("refresh_token"); 
     let headers = new Headers(); 
     headers.append('Content-Type', 'application/x-www-form-urlencoded'); 
     let options = new RequestOptions({ headers: headers }); 


     return Observable.create(
      (observer: Observer<any>) => { 
       this.http.post('https://fedqa.test.com/as/token.oauth2', body, options) 
        .map(res => res.json()).subscribe(
        (data) => { 

         localStorage.removeItem("access_token"); 
         localStorage.removeItem("refresh_token"); 
         localStorage.setItem("access_token", data.access_token); 
         localStorage.setItem("refresh_token", data.refresh_token); 
         localStorage.setItem("token_type", data.token_type); 
         localStorage.setItem("expires_in", data.expires_in); 
        }, 
        (error) => { 

         Observable.throw(error); 
        } 
        ); 
      }); 
    } 

答えて

0

私が想定しています:

  1. this.refreshToken()非同期を仮定し、その行われた後に完了し、その観測を返します。
  2. this.refreshToken()の副作用として更新され、Observableが完了すると更新されます。

concatを使用すると、前回の完了後にサブスクライブする観測可能なもの(!!)を使用できます。これはあなたのために働く可能性がありますが

... 
.retryWhen(
    errors => this.refreshToken() 
    .concat(Observable.defer(() => getStatuses(statusesType))) 
) 

immidiatelyそれはconcatで直接使用することはできませんので、ローカルストレージ内のトークンを検索します、それはthis.refreshTokenが終了した後にトリガするために持っているgetStatuses()Observable.defer

が頭に浮かぶ潜在的な無限再帰が起こるのが分かります。 retryには、エラーが発生するまでの最大再試行回数を指定することもできます。

+0

@ jnes..thisは機能していません... getStatuses()は呼び出されません。再試行も試みました。私は質問を更新しました。 – user3154990

+0

refreshtokenからのobservableは決して完了しません。ストレージを更新した後に 'observer.complete()'を追加するか、.concat()の前に.take(1) – jnes

関連する問題