带有回调的蓝鸟承诺生成器
Bluebird promise generators with callbacks
如何让 bluebird 自动将 .nodeify
/.asCallback
添加到生成的承诺中?
在bluebird中,任何promise实例都可以附加到节点回调机制:
Promise.resolve('foo').asCallback(callback);
但是,有时可能需要定义的不是 promise 本身,而是一种方法,在调用时,每次都会 returns 一个新的 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,我必须在最后 "artificially" 使用这样的临时方法:
// 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 更复杂,中间可能会发生很多事情,例如抛出未捕获的错误。如果当时没有回调处理程序附加到承诺,则只有在使用 .catch
处理承诺时才能捕获错误,并且永远不会调用 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);
};
这意味着创建两个单独的函数,但无论如何您不需要经常这样做。如果你坚持内联,你也可以使用 Promise.try
而不是 Promise.method
和 Promise.spawn
(已弃用!)而不是 Promise.coroutine
,它们会立即调用函数。
如何让 bluebird 自动将 .nodeify
/.asCallback
添加到生成的承诺中?
在bluebird中,任何promise实例都可以附加到节点回调机制:
Promise.resolve('foo').asCallback(callback);
但是,有时可能需要定义的不是 promise 本身,而是一种方法,在调用时,每次都会 returns 一个新的 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,我必须在最后 "artificially" 使用这样的临时方法:
// 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 更复杂,中间可能会发生很多事情,例如抛出未捕获的错误。如果当时没有回调处理程序附加到承诺,则只有在使用 .catch
处理承诺时才能捕获错误,并且永远不会调用 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);
};
这意味着创建两个单独的函数,但无论如何您不需要经常这样做。如果你坚持内联,你也可以使用 Promise.try
而不是 Promise.method
和 Promise.spawn
(已弃用!)而不是 Promise.coroutine
,它们会立即调用函数。