使用 Bluebird 进行异步承诺处理

Asynchronous promise handling with Bluebird

出于某些原因,我得到了一个 Bluebird 承诺,我将处理程序异步附加到该承诺上。例如:

var promise = Promise.reject(new Error('Handled rejection'));

setImmediate(function () {
    promise.then(console.log, console.error);
});

虽然我的承诺得到了很好的处理,但 Bluebird 警告我未处理的拒绝。

我可以通过同步添加一个空的拒绝处理程序来愚弄它:

promise.catch(function () {});

但是,这看起来真的很老套。这种情况有什么好的处理方法吗?

编辑:回答, I posted a more detailed illustration of my real use case in this Gist。它还包含我在等待 Bluebird 3.0 发布时使用的解决方法。正如 Benjamin 解释的那样,Bluebird 3.0 将带来 .suppressUnhandledRejection().

的解决方案

您可以使用 global rejection events,特别是 unhandledRejection,静默处理可能未处理的拒绝。然而,这意味着真正未处理的拒绝也将被静音。

您可以结合使用 rejectionHandledunhandledRejection 来决定是否处理拒绝。

或者,您可以非常小心地在每个承诺链的末尾调用 done,在这种情况下,您可以安全地忽略可能未处理的拒绝。

However, this looks really hacky. Is there any proper way to handle this kind of situation?

在 3.0 中我们有 .suppressUnhandledRejection()。在 2.0 中,就到此为止。根据我的经验,您实际上需要异步附加处理程序的情况极为罕见,我的第一直觉是怀疑代码结构有问题。

在任何一种情况下,Aaron 的回答都已经解释了如何使用全局拒绝事件,这些事件具有跨越 bluebird 实例甚至整个代码中的其他库的好处。