【问题标题】:Promise exception reported after random delay in Firefox在 Firefox 中随机延迟后报告 Promise 异常
【发布时间】:2015-07-12 21:12:17
【问题描述】:

在做一些工作时,我看到 Firebug 中报告的“未捕获异常”错误出现在看似随机的时刻。异常是在后台的 Promise 中抛出的。

起初我对报告的错误感到惊讶,因为我的理解是,在 Promise 中抛出的错误只是被捕获并沿着回调链传递。但它们也在 post-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"
}

【问题讨论】:

  • 我在移动设备上,但是 - 在 Chrome 中,未处理的拒绝跟踪在所有微任务都通过并且没有附加 catch 后运行。在 Firefox 中,它基于垃圾收集,因此它不是确定性的,但可能更安全。

标签: javascript firefox promise


【解决方案1】:

起初我对报告的错误感到惊讶,因为我的理解是在 Promise 中抛出的错误只是被捕获并沿着回调链传递

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

但我们并不真正想要那样。被默默忽略的异常?不是一个好主意。所以我们需要未处理的拒绝处理。 “未处理的异常”是一个被拒绝的承诺,没有附加错误处理程序。识别这些有一点问题,因为错误处理程序可能会在以后故意附加,我们不希望报告该承诺。尽管如此,promise 实现仍然能够跟踪它们的 promise 并报告“可能未处理的拒绝”,请参阅 this answerHow do I handle exceptions globally with native promises in node.js? 了解更多详细信息。

在 Firebug 中报告出现在看似随机的时刻。

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

【讨论】:

  • 谢谢你,Bergi 和 Benjamin,现在这两种浏览器都对我有意义。
猜你喜欢
  • 1970-01-01
  • 2013-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-26
相关资源
最近更新 更多