蓝鸟承诺与callback发电机

我如何让蓝鸟自动将.nodeify / .asCallback添加到生成的承诺?

在bluebird中,任何promise实例都可以附加到节点callback机制上:

Promise.resolve('foo').asCallback(callback);

然而,有时可能不需要定义承诺本身,而是一种被调用的方法,每次都会返回一个新的承诺,如下所示:

 // create a new random number promise each time Promise.method((foo, callback) => Math.random()); // create a new random number promise each time using a generator Promise.coroutine(function *(foo, callback) { return Math.random(); }); 

在这种情况下,如果我想附加一个callback处理程序的承诺,我不得不这样做“人为地”在最后,使用像这样一个临时的方法:

 // create a new random number promise each time using a generator Promise.coroutine(function *(foo, callback) { // do some other stuff return Promise.resolve(Math.random()).asCallback(callback); }); 

然而,实际上,我的承诺更为复杂,而且还存在一系列可能发生的事情,比如未被捕获的错误被抛出。 如果当时没有callback处理程序附加到承诺,错误将只能被捕获,如果使用.catch处理承诺, callback将永远不会被调用。

那么,如何让一个promise生成器为每个生成的promise添加一个callback处理程序?

您不需要在生成器函数中附加callback函数,而是将其附加到调用协程的位置:

 const myPromiseFunction = Promise.coroutine(function* (foo) { // do some other stuff return Math.random(); }); const myCallbackFunction = (foo, callback) => { myPromiseFunction(foo).asCallback(callback); }; // or compatible with both promise and callback usage: const myFunction = (foo, callback) => { return myPromiseFunction(foo).asCallback(callback); }; 

这意味着要创build两个独立的函数,但是您不需要经常这样做。 如果你坚持做内联,你也可以使用Promise.try而不是Promise.methodPromise.spawn (不build议使用!)而不是Promise.coroutine ,它立即调用函数。