使用 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
,静默处理可能未处理的拒绝。然而,这意味着真正未处理的拒绝也将被静音。
您可以结合使用 rejectionHandled
和 unhandledRejection
来决定是否处理拒绝。
或者,您可以非常小心地在每个承诺链的末尾调用 done
,在这种情况下,您可以安全地忽略可能未处理的拒绝。
However, this looks really hacky. Is there any proper way to handle this kind of situation?
在 3.0 中我们有 .suppressUnhandledRejection()
。在 2.0 中,就到此为止。根据我的经验,您实际上需要异步附加处理程序的情况极为罕见,我的第一直觉是怀疑代码结构有问题。
在任何一种情况下,Aaron 的回答都已经解释了如何使用全局拒绝事件,这些事件具有跨越 bluebird 实例甚至整个代码中的其他库的好处。
出于某些原因,我得到了一个 Bluebird 承诺,我将处理程序异步附加到该承诺上。例如:
var promise = Promise.reject(new Error('Handled rejection'));
setImmediate(function () {
promise.then(console.log, console.error);
});
虽然我的承诺得到了很好的处理,但 Bluebird 警告我未处理的拒绝。
我可以通过同步添加一个空的拒绝处理程序来愚弄它:
promise.catch(function () {});
但是,这看起来真的很老套。这种情况有什么好的处理方法吗?
编辑:回答.suppressUnhandledRejection()
.
您可以使用 global rejection events,特别是 unhandledRejection
,静默处理可能未处理的拒绝。然而,这意味着真正未处理的拒绝也将被静音。
您可以结合使用 rejectionHandled
和 unhandledRejection
来决定是否处理拒绝。
或者,您可以非常小心地在每个承诺链的末尾调用 done
,在这种情况下,您可以安全地忽略可能未处理的拒绝。
However, this looks really hacky. Is there any proper way to handle this kind of situation?
在 3.0 中我们有 .suppressUnhandledRejection()
。在 2.0 中,就到此为止。根据我的经验,您实际上需要异步附加处理程序的情况极为罕见,我的第一直觉是怀疑代码结构有问题。
在任何一种情况下,Aaron 的回答都已经解释了如何使用全局拒绝事件,这些事件具有跨越 bluebird 实例甚至整个代码中的其他库的好处。