1

我試圖在承諾中創建的流上運行reduce。在下例中,myApi.getItemsAsync()返回數組。來自RxJS承諾的流

我期望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()是它返回一個陣列的同步功能,減少按預期方式工作,調用與所述陣列中的每個項中的回調。

我如何得到這個與承諾一起工作?

回答

2

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 …; 
}, []) 
… 
+2

可以簡化'flatMap',因爲它會隱式處理數組,你不需要'fromArray' – paulpdaniels

+0

@paulpdaniels:是的,我懷疑這樣的事情。但我更喜歡明確的方式:-) – Bergi

+1

這個解決方案相對於返回數組(不是Rx的'reduce',而是'Array.prototype.reduce')上的簡單'reduce'有什麼優點嗎?我認爲值得考慮,直到Rx在做這種簡單的事情時有明顯的過載。 –