如何让蓝鸟自动将.nodeify
/ .asCallback
添加到生成的承诺中?
在bluebird中,任何promise实例都可以附加到节点回调机制:
Promise.resolve('foo').asCallback(callback);
然而,有时可能需要定义一个不是promise本身,而是一个方法,当被调用时,每次都会返回一个新的promise,如下所示:
// 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();
});
在这种情况下,如果我想将一个回调处理程序附加到promise,我必须在最后“人工”使用这样的即兴方法:
// 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);
});
然而,实际上,我的承诺更为复杂,并且可能会发生一系列事情,例如未被捕获的错误被抛出。如果此时没有回传处理程序附加到承诺,则只有在使用.catch
处理承诺时才能捕获错误,并且永远不会调用callback
。
那么,如何让promise生成器为每个生成的promise附加一个回调处理程序?
答案 0 :(得分:2)
你没有在生成器函数中附加回调,你将它附加到调用协程的位置:
db.getCollection('ProductFullDetails').createIndex({'offers.offers.seller.sellerId': 1, 'offers.offers.sellerProductId': 1});
这意味着创建两个单独的函数,但无论如何你都不应该这样做。如果您坚持要内联,也可以使用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);
};
代替Promise.try
和Promise.method
(已弃用!)而不是Promise.spawn
,它会立即调用该函数。