蓝鸟承诺发电机回调

时间:2017-08-29 06:07:56

标签: javascript node.js callback promise bluebird

如何让蓝鸟自动将.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附加一个回调处理程序?

1 个答案:

答案 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.tryPromise.method(已弃用!)而不是Promise.spawn,它会立即调用该函数。