如何让 bluebird 自动将 .nodeify
/.asCallback
添加到生成的 promise?
在bluebird中,任何promise实例都可以附加到 Node 回调机制:
Promise.resolve('foo').asCallback(回调);
但是,有时可能需要定义的不是 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);
});
但是,实际上,我的 promise 更复杂,中间可能会发生很多事情,例如抛出 Uncaught Error 。如果当时没有回调处理程序附加到 promise,则只有使用 .catch
处理 promise 才能捕获错误,而 callback
永远不会捕获叫。
那么,如何让 promise 生成器为每个生成的 promise 附加一个回调处理程序?
最佳答案
您不在生成器函数内附加回调,而是在调用协程的地方附加回调:
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
(已弃用!) Promise.coroutine
,它会立即调用该函数。
关于javascript - 带有回调的 Bluebird promise 生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45931779/