如何过滤bacon.js中的结束事件?

时间:2014-07-04 11:36:23

标签: bacon.js

似乎我需要在已结束的流上执行操作,但不能使用.onEnd()。让我们说我已经获得了一个URL列表,我需要根据XHR获取并注入我的应用程序。完成之后,我想继续做一些依赖于这些数据的事情,所以我真的无法并行完成。我现在正在尝试这样的事情:

var data = Bacon.fromArray(myArray).flatMap(function(url) {
    ... fetch per XHR and return ...
});

data.onValue(function() { ... do something with data ... });

Bacon.onValues(
    otherValue,
    data,
    function(value, data) {
         // I need to check whether data stream ended
         // if (data.isEnd()) obviously doesn't work
    }
)

这不仅不起作用,而且感觉不对。我该怎么做呢?

编辑:我设法破解了一起工作:data.mapEnd('we are done').filter(function(v) { return v === "we are done"; }),但我认为这是一个非常肮脏的黑客。难道还有更纯粹的东西吗?

1 个答案:

答案 0 :(得分:1)

我会在属性中存储第一个活动的状态(即已获取的URL),然后在属性达到“最终”状态时触发事件。

以下代码是否解决了您的问题?

var data = Bacon.fromArray(myArray).flatMap(fetchUrl)
var cumulativeResults = data.scan([], function(acc, result) { return acc.concat([result]) })
// a nicer implementation would ensure that every URL has indeed been fetched
var completed = cumulativeResults.filter(function(results) { return results.length == myArray.length });

completed.onValues(function(results) {
    // proceed
});