2015-07-12 49 views
1

在做一些工作时,我看到Firebug中出现的“未捕获的异常”错误出现在看似随机的时刻。背景中的承诺引发了例外情况。在Firefox中随机延迟后报告的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" 
} 
+1

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

回答

2

起初我很惊讶于所有报告的错误,我的理解是,在承诺引发的错误只是抓住并沿回调链

通过

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

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

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

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

+0

谢谢Bergi和Benjamin,现在用两种浏览器都对我有意义。 –