使用highland.js在引用原始流数据的情况下执行串行异步任务



我有一系列事件:

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

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

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

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

但一旦我有了模型,我就不知道如何在模型上调用一个方法并将data.foo传递给它

modelInstance.doStuff(data.foo);

我玩过分叉流,在分叉上拉模型,然后以不同的组合使用zipinvoke,但我没有任何运气。如果使用async,我会非常简单地通过正确的闭包用户来处理这个问题。如何使用highland.js通过流实现这一点?

最简单的方法可能是包装getModelPromise,这样它就可以返回一个promise,将您的模型和数据作为属性来解析对象,而不仅仅是您的模型。

或者,如果你不想使用承诺,你可以在高地使用:

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版本也应该有效,但我通常更喜欢传递包含所需一切的对象。

相关内容

  • 没有找到相关文章

最新更新