我有一系列事件:
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);
我玩过分叉流,在叉子上拉模型,然后使用zip
和invoke
以不同的组合使用,但是我没有运气。使用异步,我可以通过适当地使用闭包来简单地处理此问题。如何使用highland.js通过流完成此操作?
最简单的操作可能是包装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版本也应该可行,但是我通常更喜欢传递包含所需内容的对象。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句