Pre*_*aul 2 javascript asynchronous stream node.js highland.js
我有一系列事件:
var eventStream = _([{
id: 1, foo: 'bar'
}, {
id: 2, foo: 'baz'
}]);
Run Code Online (Sandbox Code Playgroud)
对于流中的每个事件,我需要加载模型的实例(我的DAL返回promises),然后在模型的每个实例上调用一个方法,将原始事件数据中的一些数据作为参数传递.
加载模型的实例并不太难:
eventStream.map(function(data) {
return getModelPromise(data.id);
}).map(_).merge(); // result is a stream of model instances
Run Code Online (Sandbox Code Playgroud)
但是一旦我有了模型,我就无法弄清楚如何在模型上调用方法并传递data.foo给它.基本上,对于我需要做的每个实例:
modelInstance.doStuff(data.foo);
Run Code Online (Sandbox Code Playgroud)
我玩过分叉流,拉叉上的模型,然后使用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);
});
Run Code Online (Sandbox Code Playgroud)
压缩modelStream和观察到的eventStream版本也应该可以工作,但我通常更喜欢传递包含所需内容的对象.
| 归档时间: |
|
| 查看次数: |
1500 次 |
| 最近记录: |