将流的每个项映射到promise并返回其值

时间:2017-02-18 13:30:09

标签: javascript promise rxjs

我正在尝试将流的每个项目映射到一个承诺,类似这样的

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?

1 个答案:

答案 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进行休息调用而不必包含承诺时,你会更容易。 (虽然从技术上讲两者都是完全有效的方式)

相关问题