【发布时间】:2021-05-31 09:00:50
【问题描述】:
我无法正确捕获承诺链中的错误/拒绝。
const p1 = () => {
return new Promise((resolve, reject) => {
console.log("P1");
resolve();
});
};
const p2 = () => {
return new Promise((resolve, reject) => {
console.log("P2");
reject();
});
};
const p3 = () => {
return new Promise((resolve, reject) => {
console.log("P3");
resolve();
});
};
p1().catch(() => {
console.log("Caught p1");
}).then(p2).catch(() => {
console.log("Caught p2");
}).then(p3).catch(() => {
console.log("Caught p3");
}).then(() => {
console.log("Final then");
});
当 promise 被拒绝时,下面的 .then 仍然会被执行。据我了解,当在 Promise 链中发生错误/拒绝时,随后的 .then 调用将不再执行。
P1
P2
Caught p2
P3
Final then
拒绝被正确捕获,但为什么在捕获后记录“P3”?
我做错了什么?
为了澄清@evolutionxbox,这是我的预期结果:
Promise.resolve().then(() => {
console.log("resolve #1");
return Promise.reject();
}).then(() => {
console.log("resolve #2");
return Promise.resolve();
}).then(() => {
console.log("resolve #3");
return Promise.resolve();
}).then(() => {
console.log("Final end");
}).catch(() => {
console.log("Caught");
});
此代码的工作方式与应有的完全一样。而且我看不出我的代码有什么不同,除了我分别声明了函数。
无论promise在哪里被拒绝,上面的代码都会停止。
【问题讨论】:
-
拒绝后的第一个
.catch()负责处理错误,然后继续默认链。 -
@Sirko 这正是发生的事情。但是为什么?我认为链条在第一次拒绝时“中止”。如何在拒绝时停止执行以下功能?为什么我不能对所有承诺使用“全局”捕获?
-
您在从 p2 捕获错误后调用 p3。 catch 处理错误,然后像没有发生一样继续进行
-
catch的返回值是一个承诺,所以它会有一个 then 方法对吗? developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…为什么你认为它应该停止? -
您的假设不正确,仅此而已。 .catch 不会停止承诺链,原因与常规 try .. catch 不会停止位于 catch 之后的代码的代码执行相同。如果这样做就没有意义
标签: javascript promise chain waterfall unhandled-promise-rejection