承诺在Firefox中随机延迟后报告异常

时间:2015-07-12 21:12:18

标签: javascript firefox promise

在做一些工作的时候,我看到"未被捕获的异常" Firebug中报告的错误出现在看似随机的时刻。例外情况被抛入了背景中的承诺。

起初我对所有错误报告感到惊讶,因为我的理解是承诺中的错误被简单地捕获并传递回调链。但它们也在后Opera(= Chrome)中报道,并且它们不会杀死脚本,所以这是一件好事。

但是在Opera中,会立即报告异常,而在Firefox中有一些看似随机的延迟(从几秒钟到半分钟)。那是为什么?

这是一个测试代码:

var p = new Promise( okLater );
p.then( kill );

function okLater( pass, fail ) {
    setTimeout( pass.bind( this, "O.K." ), 10 );
}

function kill() {
    console.log( "Killing" );
    throw "Oops"
}

1 个答案:

答案 0 :(得分:2)

  

起初我对报告错误感到惊讶,因为我的理解是承诺中的错误被简单地捕获并传递给回调链

是的,确实如此。您通过p.then(kill)创建的承诺将被拒绝。

但我们并不是真的想要那样。默认忽略的例外情况?不是个好主意。所以我们需要未处理的拒绝处理。 "未处理的异常"是一个被拒绝的承诺,没有附加错误处理程序。识别这些有一些问题,因为错误处理程序可以在以后故意附加,我们也不希望报告该承诺。尽管如此,承诺实施仍有能力跟踪其承诺并报告可能未处理的拒绝#34;,请参阅this answerHow do I handle exceptions globally with native promises in node.js?以获取更多详细信息。

  Firebug中的报道似乎是随机出现的。

当你可以完全确定在没有附加处理程序的情况下拒绝承诺的那一刻是垃圾收集时。 IIRC,Firefox确实实现了这个钩子,所以这些"随机时刻"将取决于GC行为。