Javascript 来自RxJS promise的流

Javascript 来自RxJS promise的流,javascript,functional-programming,promise,reactive-programming,rxjs,Javascript,Functional Programming,Promise,Reactive Programming,Rxjs,我正试图在我根据承诺创建的流上运行reduce 在下面的示例中,myApi.getItemsAsync()返回一个数组 我希望使用数组中的每个单独项调用reduce回调。相反,它被整个数组调用 Rx.Observable.fromPromise( myApi.getItemsAsync() ) .reduce(function (acc, item) { // expecting `item` to be a single item // instead, seeing the en

我正试图在我根据承诺创建的流上运行
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将按预期工作,使用数组中的每个项调用回调

我如何才能让它与promises一起工作?

是在整个流上工作,而不是在作为其中一部分发射的阵列上工作

如果您希望使用数组方法,那么它应该是

Rx.Observable.fromPromise(myApi.getItemsAsync())
.map(function(array) {
  return array.reduce(function (acc, item) {
    return …;
  }, []);
})
…
如果希望使用stream方法,那么首先需要在流中注入数组项。我猜在你的同步版本中你已经使用了。加上一个承诺,你会做的

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

你可以简化
flatMap
,因为它会隐式处理数组,你不需要
fromArray
@palpdaniels:是的,我怀疑是这样的。但无论如何,我更喜欢显式方法:-)与返回数组上的简单
reduce
(不是Rx的
reduce
,而是
array.prototype.reduce
)相比,此解决方案有什么优势吗?我认为,在做这样简单的事情之前,RX有很大的负担,值得一提。@ ErykNapiera:你的意思是像第一个片段一样吗?我不知道,我不这么认为。在这里,你也许可以完全避免Rx,而只是使用承诺。与第一段中的不完全一样。我考虑了如何在解决promise问题的数组上使用
reduce
。是的,在这个简单的例子中,你可以完全摆脱Rx,但我假设你不想无缘无故地使用它,而这个简单的代码只是一个例子。无论如何,我认为使用Rx处理可以同步完成的任务没有任何意义,我不认为这样做有任何好处。