蓝鸟承诺与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.method
和Promise.spawn
(不build议使用!)而不是Promise.coroutine
,它立即调用函数。