2017-04-04 179 views
15

我想拋出基於一個條件我觀察到的地圖操作錯誤拋出錯誤。例如,如果沒有收到正確的API數據。請看下面的代碼:如何從RxJS地圖運營商(角)

private userAuthenticate(email: string, password: string) { 
    return this.httpPost(`${this.baseApiUrl}/auth?format=json&provider=login`, {userName: email, password: password}) 
     .map(res => { 
      if (res.bearerToken) { 
       return this.saveJwt(res.bearerToken); 
      } else { 
       // THIS DOESN'T THROW ERROR -------------------- 
       return Observable.throw('Valid token not returned'); 
      } 
     }) 
     .catch(err => Observable.throw(this.logError(err)) 
     .finally(() => console.log("Authentication done.")); 
} 

基本上,你可以在代碼中看到,如果響應(RES對象)沒有「bearerToken」我要拋出一個錯誤。所以在我的訂閱它進入下面提到的第二個參數(handleError)。

.subscribe(success, handleError) 

有什麼建議嗎?

+3

關於'扔「不返回有效的標記」是什麼;'? –

+0

無法編譯 – Hassan

+0

請確認錯誤信息。 –

回答

22

就扔.map()運營商內部的錯誤。 RxJS中的所有回調都使用try-catch塊封裝,因此它會被捕獲併發送爲error通知。

這意味着你不返回任何東西,只是拋出錯誤:

.map(res => { 
    if (res.bearerToken) { 
    return this.saveJwt(res.bearerToken); 
    } else { 
    throw new Error('Valid token not returned'); 
    } 
}) 

Observable.throw()是可觀察到的,只是發送error通知,但map()不關心你返回的內容。即使你從map()返回可觀察到的,它會爲next信號傳遞。

最後一件事,你可能並不需要使用.catch()。如果您在發生錯誤時需要執行任何副作用,則最好使用do(null, err => console.log(err))

+0

謝謝@馬丁 - 是您的解決方案。我在我的logError方法裏面也遇到了一個問題,@GünterZöchbauer指出。我不得不從它返回錯誤對象,現在它完美地工作:)謝謝! – Hassan

+0

@馬丁:請問你爲什麼不希望你在這裏使用.catch()? – Bob

+1

@Bob因爲OP使用'catch()'來記錄和重新拋出錯誤,如果你只是想執行一個副作用(記錄錯誤),並且使用'do() – martin

1

試試這個

Observable.throw(new Error('error!'));

+0

試了一下 - 不停止流的執行也沒有錯誤被推入「訂閱」方法 – Hassan

+1

你不得不返回這個(其中一個可觀察的結果預期)停止執行。 – lintmouse

+0

此答案僅適用於'flatMap'。它不適用於'map'運算符。 – tmuecksch