在执行callback时,在Node.js中打破Q承诺?

请以承诺为理由,请原谅我的新手。 我在Node.js中使用Q模块 我有一个函数,一旦执行了所有必要的步骤,就会调用callback函数。 当我想从Q promise中调用callback函数时就会出现问题。

我希望的function是能够在达到最后一步时调用callback函数,而不再是承诺链中。 因此,callback将恢复到原来的操作状态。 但是,正如我编写的那样,callback在promise的上下文中被调用。 在这一点上,如果callback(比如说)抛出一个错误,它会被这个函数中的error handling程序捕获,这不是我想要的!

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(); } 

在这种情况下,callback函数中发生的错误会导致“OHNOES !!!!!” 被打印….

       

网上收集的解决方案 "在执行callback时,在Node.js中打破Q承诺?"

有一种方法, 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 …除非他们离开callback,在这种情况下,他们会得到一个承诺。