2017-06-22 70 views
0

我對數小時進行了研究,但找不到解決方案。基本上,我試圖在使用typescript的離子項目中處理401錯誤。如果發生,我需要刷新我的accessToken,然後調用相同的函數。我製作了一個代碼,可以實現這個功能,但召回是在組件內部完成的,而且這是一個糟糕的設計。我怎樣才能回想起應該返回Observable的函數?使用刷新令牌處理401錯誤並調用相同的函數

我的組件:

getInfos(){ 

    this.userService.getInfosUser() 
    .subscribe(
    response => { 
     console.log('success : ' , response); // Then do some logic 
    }, 
    error => { 
     this.showErrorPage(error); 
    } 
) 

我的供應商:

getInfosUser(): Observable<Response> { 

    return this.authHttp.get(this.apiUrl+'getuserinfos') 
    .map((response: Response) => { 
     return response; 
    }) 
    .catch((error: any) => { 

     if (error.status === 401 || error.status === "401") { 

      // Get and set the new accessToken 
      this.authService.handleError(error) 
      .then((result) => { 

       // Should recall getInfosUser() the function here, how ? 
      }); 


      return Observable.throw(new Error(error.status)); 
     } 
     else { 
      return Observable.throw(new Error(error.status)); 
     } 
    }) 

回答

0

我假設this.authService.handleError()返回一個承諾,所以我們將其轉換成可觀察到的。如果這是成功的,我們將添加對該可觀察項的getInfoUser()的調用。

getInfosUser(): Observable<Response> { 

    return this.authHttp.get(this.apiUrl+'getuserinfos') 
    .map((response: Response) => { 
     return response; 
    }) 
    .catch((error: any) => { 

     if (error.status === 401 || error.status === "401") { 

      return Observable.fromPromise(this.authService.handleError(error)).concat(getInfosUser()); 
     } 
     else { 
      return Observable.throw(new Error(error.status)); 
     } 
    }) 
} 

有,你可以在一個無限循環會在這裏結束,所以你可以添加一些簡單的重試邏輯是這樣一種可能性:

getInfosUser(maxRetries = 2): Observable<Response> { 

    return this.authHttp.get(this.apiUrl+'getuserinfos') 
    .map((response: Response) => { 
     return response; 
    }) 
    .catch((error: any) => { 

     if ((error.status === 401 || error.status === "401") && maxRetries > 0) { 

      return Observable.fromPromise(this.authService.handleError(error)).concat(getInfosUser(maxRetries - 1)); 
     } 
     else { 
      return Observable.throw(new Error(error.status)); 
     } 
    }) 
} 
相關問題