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 ,以静默方式消耗可能未处理的拒绝。 但是,这意味着真正的未处理的拒绝也将被压制。

您可以将rejectionHandledunhandledRejection一起使用,以自行决定是否处理拒绝。

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

但是,这看起来真的很黑。 有没有适当的方法来处理这种情况?

在3.0中,我们有.suppressUnhandledRejection() 。 在2.0中,就像你一样。 根据我的经验,实际上需要asynchronous附加处理程序的情况非常less见,我的第一本能是怀疑代码结构有问题。

无论哪种情况,Aaron的答案都已经解释了如何使用全局拒绝事件,这个事件可以跨越蓝鸟甚至整个代码中的其他库。