Bluebird的asynchronous承诺处理
出于某种原因,我得到了一个蓝鸟许诺,我附加处理程序asynchronous。 例如:
var promise = Promise.reject(new Error('Handled rejection')); setImmediate(function () { promise.then(console.log, console.error); });
虽然我的承诺处理得很好,但蓝鸟却警告我一个未经处理的拒绝。
我可以通过同步添加一个空的拒绝处理程序来欺骗它:
promise.catch(function () {});
但是,这看起来真的很黑。 有没有适当的方法来处理这种情况?
编辑 :在回答这个评论 ,我发布了一个更详细的例子,在这个Gist我真正的用例。 它还包含我在等待Bluebird 3.0发行版时使用的解决方法。 正如Benjamin所解释的那样,Bluebird 3.0将带来一个解决scheme.suppressUnhandledRejection()
。
您可以使用全局拒绝事件 ,特别是unhandledRejection
,以静默方式消耗可能未处理的拒绝。 但是,这意味着真正的未处理的拒绝也将被压制。
您可以将rejectionHandled
与unhandledRejection
一起使用,以自行决定是否处理拒绝。
或者,您可以非常小心地在每个承诺链的末尾done
调用,在这种情况下,您可以放心地忽略可能未处理的拒绝。
但是,这看起来真的很黑。 有没有适当的方法来处理这种情况?
在3.0中,我们有.suppressUnhandledRejection()
。 在2.0中,就像你一样。 根据我的经验,实际上需要asynchronous附加处理程序的情况非常less见,我的第一本能是怀疑代码结构有问题。
无论哪种情况,Aaron的答案都已经解释了如何使用全局拒绝事件,这个事件可以跨越蓝鸟甚至整个代码中的其他库。