阻止承诺触发全球“未处理拒绝”事件

时间:2016-02-05 17:06:22

标签: javascript promise

我正在写一个图书馆。有一次,我创建了一个promise,然后在稍后向其中添加then/catch个处理程序。在我实际附加错误处理程序之前,承诺可能会失败。这对我很好;这个承诺可以存在于像薛定谔一样的状态,直到我后来决定去看它。

问题是,如果任何承诺在没有错误处理程序的情况下被拒绝,某些环境会触发全局事件。也许我的一位用户在节点中做了一些像this那样激烈的事情:

process.on('unhandledRejection', function(reason){
    console.error('oops', reason);
    process.exit(1);
});

如果我知道我将要去检查其结果,我不希望我被拒绝的承诺触发。

是否有一些官方的方式我可以标记一个承诺,将其排除在任何全球“未处理的拒绝”事件之外,或者我是否真的必须同时将错误处理程序附加到每个承诺以避免这种情况?

1 个答案:

答案 0 :(得分:2)

提交环境错误(节点)。环境没有任何业务以可观察脚本的方式对其进行操作。

在Firefox和Chrome中,AFAIK没有脚本可观察的后果。

即使Chrome会将此标记为"未处理的承诺拒绝"在控制台中,使用✖符号并将其称为错误,如果随后处理了承诺,则将其退回,将changing更改为✓,并将其语言更改为" 1处理承诺拒绝"。

如果垃圾收集未处理的承诺拒绝,Firefox只会抱怨。

解决方法可能是添加hold函数,例如:

var hold = p => (p.catch(() => {}), p);

然后,只要你知道你以后就会使用它来静音Node:



var console = { log: msg => div.innerHTML += msg + "<br>" };
window.onerror = () => console.log("window onerror fired");
var wait = ms => new Promise(resolve => setTimeout(resolve, ms));

var hold = p => (p.catch(() => {}), p);

var p = hold(Promise.reject(new Error("failure")));

wait(2000).then(() => p).catch(e => console.log(e.message + " handled."));
&#13;
<div id="div"></div>
&#13;
&#13;
&#13;