【问题标题】:Using highland.js to perform async tasks in series with references to original stream data使用 highland.js 以引用原始流数据的方式串行执行异步任务
【发布时间】:2014-10-27 14:41:36
【问题描述】:

我有一个事件流:

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,但我没有任何运气。使用 async,我可以很简单地通过适当的闭包用户来处理这个问题。如何使用 highland.js 通过流实现这一点?

【问题讨论】:

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


    【解决方案1】:

    最简单的做法可能是包装 getModelPromise 以便它返回一个以您的模型和数据作为属性而不只是您的模型的对象解析的承诺。

    或者,如果您不想使用承诺,您可以在 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 版本也应该有效,但我通常更喜欢传递包含您需要的所有内容的对象。

    【讨论】:

    • 所以@caolan 如果你有 3 个流并且 #3 依赖于 #1 和 #2 的输出,那么“最佳实践”是将数据注入流中? (现在想想,Play 框架中的 Requests 也是这样工作的。)
    猜你喜欢
    • 2016-10-23
    • 2011-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-31
    • 2017-02-14
    • 2018-08-18
    • 1970-01-01
    相关资源
    最近更新 更多