2017-07-13 97 views
2

我正在使用forkJoin發出多個服務器請求。這是我通常在應用程序中使用的一種模式,它一直在運行良好。然而,我們剛剛開始實現在後端完成的用戶角色。我不確定實施角色的最佳做法是什麼,因爲我主要是前端開發人員,但這是我遇到的問題:Observable - 401導致forkJoin出錯

我們的應用程序具有成員和管理成員角色。

  1. 從每個視圖我必須調用成員和管理成員角色的後端,而不管角色是否在前端確定。

  2. 由於成員和管理員都擁有個人數據,所以會員數據總是返回給兩個角色。

  3. 僅當用戶是管理員時纔會返回管理員數據的請求。只要用戶沒有管理員權限,該請求就會返回401錯誤。這是我遇到問題的地方。

每當調用返回一個401錯誤的方法在我的訂閱方法被調用,我不訪問任何所做的包括相關的成員數據呼叫的呼叫。

在forkJoin中包含的代碼中,有五個調用傳入該方法。如果用戶是管理員,則第三次和第四次調用僅返回數據,而其餘的調用總是返回給成員或管理員。

當用戶不是管理員時,第三次調用返回401,流停止,並調用我的訂閱方法中的錯誤處理程序。這顯然不是我想要的。我希望這個流繼續下去,這樣我就可以在_data方法中使用這些數據。

我只使用RXJS 6個月,正在學習。也許我應該使用不同的模式,或者有辦法解決這個問題。任何幫助代碼示例將不勝感激。在我的代碼示例下面,我包含了另一個代碼示例,我試圖通過使用catch方法來解決問題。它沒有工作。

我查看get方法:

private getZone() { 
    this.spinner.show(); 
    this.zonesService.getZone(this.zoneId) 
    .map(response => { 
     this.zone = response['group']; 
     return this.zone; 
    }) 
    .flatMap(() => { 
     return Observable.forkJoin(
     this.teamsService.getTeam(this.zone['TeamId']), 
     this.zonesService.getZoneAssociations(this.zone['id'], '/myDevices'), 
     this.zonesService.getZoneAssociations(this.zone['id'], '/devices'), 
     this.zonesService.getZoneAssociations(this.zone['id'], '/groupMembers'), 
     this.sitesService.getSite(this.zone['SiteId']) 
    ); 
    }) 
    .subscribe(
     _data => { 
     // data handling... 
     }, 
     _error => { 
     // error handling ... 
     } 
    ); 
} 

我試圖修復:

private getZone() { 
    this.spinner.show(); 
    this.zonesService.getZone(this.zoneId) 
    .map(response => { 
     this.zone = response['group']; 
     return this.zone; 
    }) 
    .flatMap(() => { 
     return Observable.forkJoin(
     this.teamsService.getTeam(this.zone['TeamId']), 
     this.zonesService.getZoneAssociations(this.zone['id'], '/myDevices'), 
     this.zonesService.getZoneAssociations(this.zone['id'], '/devices') 
      .catch(error => Observable.throw(error)), 
     this.zonesService.getZoneAssociations(this.zone['id'], '/groupMembers') 
      .catch(error => Observable.throw(error)), 
     this.sitesService.getSite(this.zone['SiteId']) 
    ); 
    }) 
    .subscribe(
     _data => { 
     // data handling... 
     }, 
     _error => { 
     // error handling... 
     } 
    ); 
} 

回答

0

返回Observable.throw只會重新拋出捕獲錯誤,這會看到forkJoin發出錯誤。

相反,你可以使用Observable.of(null)發出null,然後完成後,將會看到forkJoin發出null的觀察到發出該錯誤:

return Observable.forkJoin(
    this.teamsService.getTeam(this.zone['TeamId']), 
    this.zonesService.getZoneAssociations(this.zone['id'], '/myDevices'), 
    this.zonesService.getZoneAssociations(this.zone['id'], '/devices') 
     .catch(error => Observable.of(null)), 
    this.zonesService.getZoneAssociations(this.zone['id'], '/groupMembers') 
     .catch(error => Observable.of(null)), 
    this.sitesService.getSite(this.zone['SiteId']) 
); 

或者,如果你想發出錯誤的值,您可以使用Observable.of(error)

+0

謝謝。這真棒,它完美運作。 – Aaron