gpt4 book ai didi

javascript - 防止 promise 触发全局 'unhandled rejection' 事件

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:14:33 25 4
gpt4 key购买 nike

我正在编写一个库。有一次我创建了一个 promise,然后在稍后猛扑向它添加 then/catch 处理程序。在我实际附加错误处理程序之前,promise 可能会失败。这对我来说很好; promise 可以像薛定谔猫一样存在,直到我稍后决定查看它。

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

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

如果我知道我稍后会去检查它的结果,我不希望我拒绝的 promise 触发它。

是否有一些正式的方法可以标记 promise 以将其从任何全局“未处理的拒绝”事件中排除,或者我真的必须将错误处理程序同步附加到每个 promise 以避免这种情况吗?

最佳答案

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

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

尽管 Chrome 最初会在控制台中将此标记为“未处理的 promise 拒绝”,并带有 ✖ 符号,并将其称为错误,但如果随后处理了 promise ,它将 ✖ 更改为 ✓,它稍后会退缩,并将其语言更改为“1 handled promise rejection”。

Firefox 只会在未处理的 promise 拒绝被垃圾收集时提示。

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

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

然后只要您知道稍后会得到一个 promise ,就可以使用它来使 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."));
<div id="div"></div>

关于javascript - 防止 promise 触发全局 'unhandled rejection' 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35229681/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com