首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Highland.js中流的异步转换

Highland.js中流的异步转换
EN

Stack Overflow用户
提问于 2014-12-19 06:13:19
回答 2查看 1.6K关注 0票数 1

我正在尝试使用Highland.js在一组Mongoose模型上执行数据库更新脚本,它似乎非常适合在Model.find()上进行QueryStream调用。我有一些同步的事情要做(更新我的模型以符合新的模式,一些清理操作),最后我想对文档执行save()操作。我已经配置了一些需要运行的预保存钩子,并且更新并不真正与直接的Model.update()兼容。我设法让它在某种程度上通过Q.js和Highland的组合工作:

代码语言:javascript
复制
var sender_stream = Sender.find({}).stream();
var promise_save = function(document) {
    var deferred = Q.defer();
    document.save(deferred.makeNodeResolver());
    return _(deferred.promise);
}

var sender_deferred = Q.defer();
_(sender_stream).map(function(sender) {
    // set some fields on sender...
    return sender;
}).map(promise_save).series().on('done', sender_deferred.resolve).resume();

然而,这似乎并没有解决承诺,我不确定这是否是让事情变得美好和顺畅的“正确”方式……将Q.js和Highland.js如此紧密地结合在一起似乎也很奇怪。有没有更好的方法?

EN

回答 2

Stack Overflow用户

发布于 2014-12-19 15:43:50

我对Q或Highland了解不多。但这似乎是querystreams上transform函数的一个简单用例。

代码语言:javascript
复制
var stream = Sender.find({}).stream({ transform: manipulate })

function manipulate(document) {
    // do stuff here
    return document;
}

stream.on("data", function(document) {
    stream.pause()
    document.save(function(error) {
        // error handle, maybe stream.destroy([err]) if you want it to stop immediately
        stream.resume();
    });
});

stream.on("error", function(err){
    //error handle
});

stream.on("close", function(){
    console.log("hopefully this worked for you");
});

转换函数将在发出'data‘事件之前在文档上运行。一旦转换函数完成了它的工作,它的返回值就被发送给'data‘函数。然后,您只需暂停/保存/恢复。

票数 2
EN

Stack Overflow用户

发布于 2015-01-07 09:44:50

您可以使用Highland的异步功能:http://highlandjs.org/#async,而不是Promise。Mongoose也会返回一个Promise,所以你可以用Highland而不是async function风格来包装它,但仍然要避免添加Q。

我建议使用.flatMap()而不是.map().series()来将这些流展平为一个文档流。然后,添加.done()也可以用来创建一个.resume(),而不是使用与'done‘事件侦听器相结合的Thunk。

老实说,我不是100%确定为什么你在调用“完成”事件时会有问题。

代码语言:javascript
复制
var sender_stream, set_fields, save, sender_deferred;

sender_stream = Sender.find({}).stream();

save = function save(document) {
    return _(function(push, next) {
        document.save(function(err, result) {
            push(err, document);
            push(null, _.nil);
        });
    });
};

set_fields = function setFields(sender) {
    // set some fields on sender...
    return sender;
};

sender_deferred = Q.defer();

_(sender_stream)
    .map(setFields)
    .flatMap(save)
    .done(function() {
        sender_deferred.resolve();
    });
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27556638

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档