2016-11-02 6 views
1

retryの後に再試行を呼び出したい場合は、動作していない場合、retryWhenの後に同じobservableを呼び出すにはどうすればよいですか。私のコードが再試行に達していません。ここretryの後にretryを呼び出すことはできますか?

getStatuses(statuses : string[]): Observable<IStatus[]> { 
    let body = JSON.stringify({ "Statuses": statuses }); 
    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(error)).retry(3) 
       .map((res: Response) => { 
        this.inspections = res.json(); 
        return this.inspections; 
       }); 
} 

は、問題があなたのrefreshToken機能は、実際にエラーを処理または放出しないということであるNY refreshToken()関数

refreshToken(error$:any): Observable<any> { 
    return error$.flatMap((err:Error) => { 
     console.log("refreshing token"); 
     const body: string = 'grant_type=refresh_token&refresh_token=' + 
           localStorage.getItem("refresh_token"); 
     const headers = new Headers(); 
     headers.append('Content-Type', 'application/x-www-form-urlencoded'); 

     const options = new RequestOptions({ headers: headers }); 

     // Make the refresh call as normal 
     return this.http.post('https://loginqa.test.com/as/token.oauth2', body, options) 
    }).map((res: Response) => { 
      return res.json(); 

     }) 

     .do((resp:Response) => { 
      var resultsToken=resp.json(); 
      alert("testing refresh_token"); 
      localStorage.removeItem('access_token'); 
      localStorage.removeItem('refresh_token'); 
      localStorage.setItem("access_token", resultsToken.access_token); 
      localStorage.setItem("refresh_token", resultsToken.refresh_token); 

} 
+0

:?

// Pass in the error stream so you are actually processing when there is an // exception refreshToken(error$): Observable<any> { return error$.flatMap(err => { console.log("refreshing token"); const refreshToken = localStorage.getItem('refreshToken'); const body: string = 'grant_type=refresh_token&refresh_token=${refreshToken}'; const headers = new Headers(); headers.append('Content-Type', 'application/x-www-form-urlencoded'); const options = new RequestOptions({ headers: headers }); // Make the refresh call as normal return this.http.post('https://fedqa.test.com/as/token.oauth2', body, options); }) .map(res => res.json()) .do(resp => { // If there is no error, this will emit a next value // and which will trigger the retry // An error triggers, then this will not run and the retryWhen // will skip ahead to the retry operator. localStorage.removeItem('access_token'); localStorage.removeItem('refresh_token'); localStorage.setItem("access_token", resp.access_token); localStorage.setItem("refresh_token", resp.refresh_token); localStorage.setItem("expires_in", resp.expires_in); }); } 

そして、同じように使用 – paulpdaniels

+0

@paulpdaniels質問を更新しました。 – user3154990

+0

をチェックして最新のコードに更新するか、エラーを示すjsbinを作成できますか? – paulpdaniels

答えて

1

です。 retryに達するためには、これが必要です。

subscribeブロックでは、throwオペレータを購読していないので、エラーは決してどこにも行きません。

私はrefreshTokenをリファクタリングして、失敗した場合に実際にエラーを出すようにします。 `何を返すrefreshToken`ん

.retryWhen(error$ => this.refreshToken(error$)).retry(3); 
+0

@ user3154990あなたは 'map'演算子から何も返されません。次に、未定義の値で 'json()'を呼び出そうとしていますので、あなたのコードは 'retryWhen'からジャンプして' retry'に直進します。インライン関数を使用していない場合は、 '.map(resp => {return resp.json();}'を実行する必要があります。 – paulpdaniels

+0

私はまだマップ関数のデータを返した後でも同じエラーが発生します。私の質問を再度更新しました... – user3154990

+0

'do'でrespから' json() 'を読み込もうとしていますが、あなたはすでにマップ内でそれを解析しています – paulpdaniels

関連する問題