我正在尝试将流的每个项目映射到一个承诺,类似这样的
myStream$
.flatMap(id => Rx.Observable.fromPromise(database.get(id)))
.subscribe(val => console.log(val));
myStream$
有大约15个项目。由于在数据库中找不到这些项目,因此每个承诺都将被拒绝。我期待15个日志输出打印错误。但是我得到的只是一个错误
rx.js:77 Uncaught {“status”:404,“name”:“not_found”,“message”:“missing”,“reason”:“missing”}
为什么我只收到一个错误而不是15?
答案 0 :(得分:1)
此行为是预期的 - 每当引发错误时,流将最终确定(换句话说:"停止&取消订阅所有订阅者")。
如果您希望您的流无论一个或所有db-request失败都能正确完成,您必须处理包装承诺的子流中的错误,因为reject
将被评估为{在RxJS中{1}}。
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();
。
Sidenote&amp;建议:当你直接使用RxJS进行休息调用而不必包含承诺时,你会更容易。 (虽然从技术上讲两者都是完全有效的方式)