在 then 中恢复 promise 错误,核心做法是返回一个已解决的 promise(如 promise.resolve())或直接返回一个非 promise 的正常值。这样做的目的是将当前链路的错误状态重置为成功状态,从而阻断错误的向下游传递,让后续的 then 继续执行。

为什么 catch 能捕获 then 中的错误?
catch 方法本质上就是 then(null, onRejected) 的语法糖,它专门用于处理链路中任何未捕获的拒绝状态。当 then 的回调函数抛出异常或返回一个被拒绝的 Promise 时,生成的新 Promise 会进入拒绝态,此时 catch 就能拦截到它。这种机制确保了无论错误发生在链路的哪个环节,只要没有被显式“消化”,最终都会流向 catch。

function fetchData() {
return new Promise((resolve, reject) => {
setTimeout(() => {
if (Math.random() > 0.5) {
resolve("Success");
} else {
reject(new Error("Network Error"));
}
}, 100);
});
}
fetchData()
.then(data => {
console.log("Step 1:", data);
throw new Error("Processing Failed");
})
.catch(err => {
console.log("Caught in catch:", err.message);
return "Recovered Data";
})
.then(result => {
console.log("Step 2:", result);
});如何在 then 内部直接恢复而不使用 catch?
如果希望在 then 阶段就完成错误恢复,避免错误传递给后续的 catch,可以在 then 的回调中通过 try...catch 包裹逻辑,并在捕获到错误后返回一个正常值。这种做法利用了 Promise 链的状态机特性:只要 then 返回的是正常值(非 Promise 对象),或者返回一个已解决的 Promise,整个链路的后续节点就会以“成功”模式运行,之前的错误就被彻底隔离了。
立即学习“Java免费学习笔记(深入)”;

function safeProcess(value) {
return new Promise((resolve, reject) => {
setTimeout(() => {
if (value === null) {
reject(new Error("Null Input"));
} else {
resolve(value * 2);
}
}, 100);
});
}
safeProcess(null)
.then(result => {
console.log("Processed:", result);
return result; // 如果上面没报错,这里会继续
})
.catch(err => {
console.log("Error handled:", err.message);
return "Default Value"; // 恢复为默认值
})
.then(finalResult => {
console.log("Final Result:", finalResult); // 输出: Final Result: Default Value
});基于 return undefined 的具体行为分析
当 then 的回调函数中没有 return 语句,或者显式返回 undefined 时,Promise 链会将该步骤视为成功,并将 undefined 作为结果传递给下一个 then。这在错误恢复场景中非常有用,例如当你只想忽略某个步骤的错误并继续执行后续逻辑,而不需要保留任何数据时。这种行为与返回 Promise.resolve() 类似,但更简洁,因为它不需要创建新的 Promise 对象,而是直接利用当前的成功状态流转。


















