带有回调的蓝鸟承诺生成器

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.methodPromise.spawn (已弃用!)而不是 Promise.coroutine,它们会立即调用函数。