使用highland.js与原始流数据的引用串行执行异步任务

时间:2014-09-03 07:22:38

标签: javascript node.js asynchronous stream highland.js

我有一系列事件:

var eventStream = _([{
  id: 1, foo: 'bar'
}, {
  id: 2, foo: 'baz'
}]);

对于流中的每个事件,我需要加载模型的实例(我的DAL返回promises),然后在模型的每个实例上调用一个方法,将原始事件数据中的一些数据作为参数传递。

加载模型的实例并不太困难:

eventStream.map(function(data) {
    return getModelPromise(data.id);
}).map(_).merge(); // result is a stream of model instances

但是一旦我拥有模型,我就无法弄清楚如何在模型上调用方法并将data.foo传递给它。基本上,对于我需要做的每个实例:

modelInstance.doStuff(data.foo);

我已经玩过分叉流,在叉子上拉模型然后以不同的组合使用zipinvoke,但我没有运气。有了异步,我会通过适当的闭包用户来处理这个问题。如何使用highland.js来实现这一点?

1 个答案:

答案 0 :(得分:8)

最简单的事情可能是将getModelPromise包装起来,以便它返回一个使用模型和数据作为属性而不仅仅是模型解析为对象的promise。

或者,如果您不想使用承诺,您可以在Highland执行此操作:

var modelStream = eventStream.map(function (data) {
    return _(getModelPromise(data.id)).map(function (model) {
        return {data: data, model: model};
    });
}).parallel(10);

// then...
modelStream.map(function (x) {
    x.model.doStuff(x.data.foo);
});

压缩modelStream和eventStream的观察版本也应该有效,但我通常更喜欢传递包含所需内容的对象。