javascript promise 实现异步操作的错误恢复,核心在于利用 .catch() 方法捕获异常,或在 .then() 中返回新的 promise 以提供默认值。通过链式调用,可以在不中断后续流程的前提下处理错误,例如在请求失败时返回备用数据,从而保证应用状态的连续性。

.catch() 如何拦截并处理拒绝
.catch() 用于捕获 Promise 链中任何被拒绝(rejected)的状态。当上游的异步操作抛出错误或显式调用 reject 时,执行流会跳过后续的 .then(),直接跳转到最近的 .catch() 处理器。这允许开发者集中处理错误逻辑,而不是在每个步骤都进行判断。

function fetchData() {
return new Promise((resolve, reject) => {
setTimeout(() => {
const hasError = Math.random() > 0.5;
if (hasError) {
reject(new Error("Network timeout"));
} else {
resolve({ data: "Success" });
}
}, 100);
});
}
fetchData()
.then(result => {
console.log("Data:", result.data);
return result;
})
.catch(error => {
console.warn("Caught error:", error.message);
return { data: "Fallback Data" };
})
.then(finalResult => {
console.log("Final Result:", finalResult.data);
});运行上述代码,若触发拒绝,控制台将输出:
Caught error: Network timeout
Final Result: Fallback Data
这表明 .catch() 成功拦截了错误,并通过返回新对象恢复了链式调用。
立即学习“Java免费学习笔记(深入)”;
如何在 .then() 中提供降级数据
除了使用 .catch(),还可以在 .then() 内部通过检查状态或捕获同步错误来实现恢复。如果在 .then() 的处理函数中返回一个新的 Promise 或一个非 Promise 的值,链将继续向下传递。这种方法适用于需要在成功路径中进行局部容错的情况,例如在解析 JSON 失败时提供默认结构。

function parseJSON(input) {
try {
return JSON.parse(input);
} catch (e) {
throw new Error("Invalid JSON");
}
}
const input = "{ invalid json }";
Promise.resolve(input)
.then(data => {
try {
return parseJSON(data);
} catch (err) {
console.error("Parse failed, using default");
return { status: "default", value: 0 };
}
})
.then(result => {
console.log("Recovered Result:", result);
});运行结果:
Parse failed, using default
Recovered Result: { status: 'default', value: 0 }
这里通过在 .then() 内部捕获异常并返回默认对象,实现了数据的降级恢复,避免了错误向下游传播。
基于 .catch() 返回值的类型确认
当 .catch() 处理完错误后,它必须返回一个值(可以是普通值或新的 Promise),否则链中的下一个 .then() 将接收到 undefined 或继续处于拒绝状态。如果 .catch() 中没有返回值,或者重新抛出了错误,后续的 .then() 将无法获取到恢复后的数据。因此,确保 .catch() 总是返回一个有效的、符合预期结构的对象,是错误恢复的关键。


















