javascript - 带有回调的 Bluebird promise 生成器

标签 javascript node.js callback promise bluebird

如何让 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.methodPromise.spawn (已弃用!) Promise.coroutine,它会立即调用该函数。

关于javascript - 带有回调的 Bluebird promise 生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45931779/

相关文章:

c++ - 将非静态成员函数作为参数传递

c - 我正在学习 "Function callback"并且我的代码中出现了段错误?

javascript - 从带有 Node 的字符串中提取城市名称

javascript - Css 悬停选择器应该选择完整的行

javascript - 如何在Backbone中向另一个页面传递参数?

facebook - 异步和并行处理

javascript - 响应式导航 - 单击时如何更改菜单图标

node.js - 媒体播放器在 Google Assistant 上运行良好,而模拟器则不然

node.js - 谷歌云任务: How to update a tasks time to live?

java - ArrayAdapter 构建 ArrayList 时未正确处理单击事件