2017-02-18 39 views
1

我想流的每個項目映射到一個承諾,像這樣流的每個項目映射到一個承諾並返回其值

myStream$ 
    .flatMap(id => Rx.Observable.fromPromise(database.get(id))) 
    .subscribe(val => console.log(val)); 

myStream$有大約15個項目。由於這些項目都不能在數據庫中找到,每個承諾都會被拒絕。我期待15日誌輸出打印錯誤。然而我得到的只有一個錯誤

rx.js:77未捕獲{「status」:404,「name」:「not_found」,「message」:「missing」,「reason」:「missing」 }

爲什麼我只得到一個錯誤而不是15?

+0

這是否鏈接幫助: https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/frompromise.md#example 基本上他們定義的承諾,然後訂閱返回值 – Sid

+0

嗯,不是真的,對不起。基本上和我一樣。這裏的問題是,我只在這裏得到一個單一的輸出而不是倍數。 – Lukas

回答

1

此行爲是預期的 - 每當發生錯誤時,流將最終確定(換句話說:「停止&取消訂閱所有訂戶」)。

如果您希望流正常完成而不管一個或所有數據庫請求失敗,您必須處理包含承諾的子流內的錯誤,因爲在RxJS中reject將被評估爲error

Rx.Observable.from([1,2,3,4,5]) 
 
    .flatMap(
 
    id => mockRequest(id) 
 
     .catch(error => { 
 
     console.error(error); 
 
     return Rx.Observable.empty(); // here we just return an empty stream, so the "main"-stream won't receive the error and continue with the other ids in the queue 
 
     }) 
 
) 
 
    .subscribe(
 
    val => console.log(val), 
 
    error => console.error("Stream hit an error and will finalize", error), 
 
    complete => console.log("Done!") 
 
); 
 
    
 
function mockRequest(id) { 
 
    return Rx.Observable.throw("Request failed for: " + id); 
 
}
<script src="https://unpkg.com/rxjs/bundles/Rx.min.js"></script>

注:與其return Rx.Observable.empty();你當然可以通過Observable.of("myFallbackValue")


阿里納斯返回任何回退值&建議:你把它容易當你讓你的休息 - 直接與RxJS通話,而不必包裝承諾。 (雖然在技術上都是非常有效的方法)

+1

謝謝,這很有道理!至於REST調用,它是在Electron應用程序中對PouchDB的數據庫調用。我不確定他們提供了一個API,而不是他們自己的基於承諾和回調的方法。 – Lukas

+0

好的快速谷歌搜索顯示關於pouchdb和rxjs的各種結果 – Lukas

相關問題