在Node.js中执行回调时违反了Q承诺



请原谅我对承诺概念的新手。我使用Node.js中的Q模块。我有一个函数,它可以在回调完成所有必要的步骤后调用回调。当我想从Q promise中调用回调函数时,就会出现问题。

我想要的功能是当我到达最后一步时能够调用回调,并且不再处于承诺链中。因此,回调将返回到其原始操作。然而,正如我所编写的,回调是在promise的上下文中调用的。在这一点上,如果回调(比如)抛出错误,它会被这个函数中的错误处理程序捕获,这不是我想要的!

var updateDataStream = function(data, input, posts, stream, callback) {
    // Pack all the items up...
    Q.ncall(data._packStream, data, posts, stream)
    // Upsert the cache into the database
    .then(function(){
        return Q.ncall(data.upsert, data);
    })
    // buffer the new input
    .then(function(res){
        return Q.ncall(data.buffer, data, input);
    })
    .then(function(final){
        callback(null, final);
    })
    .fail(function(err){
        console.log('OHNOES!!!!!!!',err);
    }).end();
}

在这种情况下,回调函数中发生的错误会导致打印"OHNOES!!!!"。。。。

有一个方法nodeify,它将(可选)脱离承诺链并转发到NodeJS风格的延续。

var updateDataStream = function(data, input, posts, stream, callback) {
    // Pack all the items up...
    return Q.ncall(data._packStream, data, posts, stream)
    // Upsert the cache into the database
    .then(function(){
        return Q.ncall(data.upsert, data);
    })
    // buffer the new input
    .then(function(res){
        return Q.ncall(data.buffer, data, input);
    })
    .nodeify(callback);
}

请注意,在链的开头添加了"return",在末尾添加了"nodeify(callback)"。

你的用户根本不需要知道你在使用Q……除非他们停止回调,在这种情况下,他们会得到一个承诺。

相关内容

  • 没有找到相关文章

最新更新