← 全部文章

技术与生活 / 一篇记录

异步链条里的错误,需要有人接住

then 中返回的值决定下一步接收什么,而抛出的错误会进入拒绝路径。如果在错误处理中只打印日志然后正常返回,后续阶段可能继续按成功结果执行。

先明确这里的区别

异步结果需要同时处理成功和失败,未处理拒绝会让问题难以追踪。

以下示例可在现代浏览器的开发者工具中观察;涉及 DOM 的代码需要在网页环境运行。

Promise.resolve('ok').then(console.log).catch(console.error);

怎样判断处理正确

把 resolve 换成 reject,确认错误路径也可观察。

主动制造一次网络或解析失败,观察调用方最终拿到的状态。能恢复就给出明确替代值,不能恢复就继续传递错误,别让失败悄悄变成 undefined。

then 中启动另一项异步操作时,记得返回对应 Promise。遗漏返回值会让后续步骤提前继续,外层 catch 也可能接不到内层失败,调试时看起来像错误偶尔消失。

需要留意的是,catch 后不再抛出错误,会把链条转成已处理状态。

参考:JavaScript 文档。

搜索文章

输入关键词,找回一篇记录。