promise
核心理解
Promise then()
、finally()
方法默认会向上传递,而 catch()
方法则需要将错误抛出才行
注意的事项
错误处理
catch()
或 then()
方法中如果错误没有被处理,它将被传递到 Promise 链中的下一个 catch()
方法或全局错误处理程序。
错误传递
如果您希望将错误传递到 Promise 链中的下一个 catch()
方法,您可以在当前 catch()
中使用 throw 语句或返回一个被拒绝的 Promise。这样做可以确保错误在 Promise 链中正确传递。
错误堆栈信息
当向上传递错误时,Promise 会保留错误的堆栈信息,这对于调试和定位问题非常有用。确保在错误处理中适当地使用和记录错误的堆栈信息。
例如
ts
promise.catch((onrejected) => {
console.log("beforeHandle:catch");
// 重新抛出错误。这样,错误将继续向上层传递 否则将终止
throw onrejected;
});
异步错误处理
如果您在 Promise 链中处理异步操作,例如使用 addEventListener()
或异步函数等,确保在适当的位置进行错误处理。 不然会导致永远执行不到 then()
方法,可以设置一个超时时间来解决。
ts
const step = async () => {
await next(); // 此处 Promise 没有执行 resolve()
// next 将永远不会输出并阻塞后面逻辑
console.log("next");
};
示例
ts
const promise = new Promise<string>((resolve, reject) => {
setTimeout(() => {
// resolve("test")
reject("test");
}, 1000);
});
const beforeHandle = () => {
return promise
.then(() => {
// 执行中错误会导致 catch 捕捉
console.log("beforeHandle:then");
})
.catch((onrejected) => {
console.log("beforeHandle:catch");
// 重新抛出错误。这样,错误将继续向上层传递 否则将终止
throw onrejected;
})
.finally(() => {
// 执行中错误会导致 catch 捕捉
console.log("beforeHandle:finally");
});
};
const main = () => {
beforeHandle()
.then(() => {
console.log("main:then");
})
.catch(() => {
console.log("main:catch");
})
.finally(() => {
console.log("main:finally");
});
};
main();