【问题标题】:Stream from RxJS promise来自 RxJS 承诺的流
【发布时间】:2015-08-20 17:51:47
【问题描述】:

我正在尝试在我根据承诺创建的流上运行reduce

在下面的示例中,myApi.getItemsAsync() 返回一个数组。

我希望reduce 回调会被数组中的每个单独的项目调用。相反,它是用整个数组调用的。

Rx.Observable.fromPromise(
  myApi.getItemsAsync()
)
.reduce(function (acc, item) {
  // expecting `item` to be a single item
  // instead, seeing the entire array
}, [])
.subscribe(function (result) { 
  console.log(result);
});

如果myApi.getItemsAsync() 是一个返回数组的同步函数,则reduce 将按预期工作,并使用数组中的每个项目调用回调。

我如何让它与 Promise 一起使用?

【问题讨论】:

    标签: javascript functional-programming promise reactive-programming rxjs


    【解决方案1】:

    reduce 正在处理整个流,而不是作为其一部分发出的数组。

    如果你想使用数组方法,那么它应该是

    Rx.Observable.fromPromise(myApi.getItemsAsync())
    .map(function(array) {
      return array.reduce(function (acc, item) {
        return …;
      }, []);
    })
    …
    

    如果您希望使用流方法,那么您需要先将数组项注入流中。我猜在你的同步版本中你使用了fromArray。再加上一个承诺,你会做的

    Rx.Observable.fromPromise(myApi.getItemsAsync())
    .flatMap(function(array) {
      return Rx.Observable.fromArray(array);
    }).reduce(function (acc, item) {
      return …;
    }, [])
    …
    

    【讨论】:

    • 你可以简化flatMap,因为它会隐式处理数组,你不需要fromArray
    • @paulpdaniels:是的,我怀疑是这样的。但无论如何我更喜欢明确的方式:-)
    • 这个解决方案在返回数组(不是 Rx 的 reduce,而是 Array.prototype.reduce)上比简单的 reduce 有什么优势吗?我认为在做像这样的简单事情时,在 Rx 严重超载之前值得考虑。
    • @ErykNapierała:你的意思是像第一个 sn-p 那样?我不知道,我不这么认为。而且您可能可以在这里完全避免使用 Rx,而只需使用 Promise。
    • 与第一个 sn-p 中的 on 不完全一样。我在数组上考虑了reduce,通过它解决了承诺。是的,在这种简单的情况下,您可以完全摆脱 Rx,但我假设您不想无缘无故地使用它,而简单的代码只是示例。无论如何,我认为将 Rx 用于可以同步完成的任务没有任何意义,我认为这样做没有任何优势。
    猜你喜欢
    • 2022-12-07
    • 2016-12-13
    • 1970-01-01
    • 1970-01-01
    • 2016-05-16
    • 1970-01-01
    • 1970-01-01
    • 2017-05-12
    • 2015-07-08
    相关资源
    最近更新 更多