gpt4 book ai didi

javascript - 无法捕获使用 Promise 'catch' 在 Promise 中抛出的错误

转载 作者:行者123 更新时间:2023-12-02 21:30:00 25 4
gpt4 key购买 nike

我有这个代码。

new Promise(() => {
setTimeout(() => { throw new Error('ERROR') }, 1000);
}).catch(err => {
console.log('CATCHED ', err);
});

并且它不会捕获在 setTimeout 中抛出的错误。为什么?

最佳答案

您对我的评论的评论表明该案例与其他答案不同。我实在无法在评论中加入这个解释,所以:

实际上,catch block 不会等待 Promise 被拒绝。试试这个:

const myPromise = new Promise(() => {
console.log('inside of the promise');
setTimeout(() => { console.log('inside of the timeout function'); throw new Error('ERROR') }, 1000);
}).catch(err => {
console.log('CATCHED ', err);
});
console.log('outside of the catch block, and my promise is', myPromise);

您会发现捕获消息的外部先于超时函数内部的消息写入控制台。此时, promise 尚未解决(待处理)。

当您使用 setTimeout 时,该函数会被添加到 JavaScript 队列的末尾。

编辑

您可以通过对 Promise 调用拒绝来解决此问题。

const myPromise = new Promise((resolve,reject) => {
setTimeout(() => { reject('ERROR'); }, 1000);
}).catch(err => {
console.log('CAUGHT ', err);
});

这是不同的,因为在这种情况下,拒绝函数被保留在范围气泡(闭包)中,因此它仍然能够解析。

编辑2

我确实发现了另一个问题,在评论中对此进行了一些讨论:

JavaScript Promises - reject vs. throw

据此,我会修改我的解释。

首先,将 catch block 与链接到 Promise 的 catch 函数分开是很有帮助的。将 Promise 视为使用内置的不可见 catch block 捕获抛出的错误。在处理它时,promise 的 catch block 将调用“reject”,这将触发 catch 函数

抛出错误=>promise的不可见(隐式)catch block =>reject()=>promise的catch()函数

但是,如果错误是从不同的调用堆栈(使用 setTimeout 时)抛出的,则它无法捕获它。

抛出错误(在 setTimeout 的另一个调用堆栈中)=> 未捕获的异常

链停在那里,因为异常在不同的调用堆栈中冒泡。

但是您仍然可以调用拒绝,触发 catch 函数,这就是上面的代码片段的作用。

reject => Promise 的 catch() 函数

这是一个较短的事件链,直接切入您想要的行为 - 触发 catch 函数中的代码。

关于javascript - 无法捕获使用 Promise 'catch' 在 Promise 中抛出的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60644708/

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