2016-11-01 38 views
0

我試圖從retry執行一個函數時,當retryWhen完成時調用父函數。我怎樣才能做到這一點?如何調用父功能retryWhen 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獲取在前一個完成後(!!)後訂閱的可觀察值。

getStatuses()將immidiately查找在本地存儲的令牌,因此它不能直接在concat使用,它具有觸發this.refreshToken完成後,Observable.defer想到:

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

雖然這可能會爲你工作我看到潛在的無限遞歸發生。您可能還想查看retry,其中需要一個數字,該數字是發生錯誤之前執行的最大重試次數。

+0

@ jnes..this不工作... getStatuses()不被調用..我嘗試了重試太..我更新了問題 – user3154990

+0

從refreshToken observable從來沒有完成。在更新存儲之後添加'observer.complete()'或在.concat()之前添加.take(1) – jnes