gpt4 book ai didi

javascript - 如何处理导致未解决 promise 的异常

转载 作者:行者123 更新时间:2023-11-29 20:47:30 25 4
gpt4 key购买 nike

在处理由于不可预见的未捕获异常而无法解决的 promise 时,我看到了一些不一致的行为。似乎取决于我如何链接 promise 会改变这个 promise 是否解决,我不明白为什么。

这是错误的功能:

function bad() {
return new Promise(resolve => {
setTimeout(() => {
throw 'unforseen exception!';
resolve();
}, 50);
});
}

如果我以这些方式调用此函数,它不会解析:

bad().then(() => console.log('resolved')); // no console logging

try {
await bad();
} catch(e) {
console.log(e);
}
console.log('resolved'); // no console logging

但是这样调用它确实解决了:

Promise.resolve().then(bad()).then(() => console.log('resolved')); // console logs "resolved"

这是为什么? 编辑:我现在明白我做错了什么了。但我真正想回答的是下一部分。

当我有一个需要连续运行的 promise 链并且即使链条中某处出现故障也需要继续时,我如何最好地保护自己免受不可预见的异常的影响?

我也尝试过使用 catch 或 finally 但它们似乎没有任何区别。一旦达到 Unresolved promise ,执行就会失败。

最佳答案

问题是 bad() 以调用者无法检测到错误的方式异步 抛出错误。如果你想在 new Promise... 段中抛出错误,你应该调用 reject 函数:

function bad() {
return new Promise((resolve, reject) => {
setTimeout(() => {
reject('bad!');
resolve();
}, 50);
});
}


bad()
.then(() => console.log('resolved'))
.catch((err) => console.log(err));

(async () => {
try {
await bad();
} catch(e) {
console.log(e);
}
console.log('await finished');
})();

你的原因

Promise.resolve().then(bad()).then

调用下一个 .then 是因为 then 接受一个 function 作为参数,但是你的 bad()在开始时调用 bad,而解释器正试图提出 Promise 链。如果您将 bad 作为函数参数传递而不是调用它,您会看到与原始代码中类似的损坏行为 - Promise 永远不会解析:

function bad() {
return new Promise(resolve => {
setTimeout(() => {
throw 'unforseen exception!';
resolve();
}, 50);
});
}

// Promise never resolves:
Promise.resolve().then(bad).then(() => console.log('resolved'));

相比之下,.then(bad()) 将求值为非函数,因此 .then立即解析,所以解释器也会立即继续执行下一个 .then

关于javascript - 如何处理导致未解决 promise 的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53842738/

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