MST
星途 面试题库

面试题:JavaScript中如何处理Promise链中的错误,有哪些常见方式?

假设你有一个包含多个Promise的链式调用,例如 `Promise.resolve().then(func1).then(func2).then(func3)`,请阐述在这个Promise链中出现错误时,有哪些方式可以捕获并处理错误,每种方式的原理和适用场景是什么。
13.2万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试

使用 .catch 方法

  • 原理:在Promise链中,任何一个 then 回调函数抛出错误或返回一个被拒绝的Promise时,错误会沿着Promise链向后传递,直到遇到 .catch 方法。.catch 方法会捕获这些错误,并执行相应的错误处理逻辑。
  • 适用场景:适用于整个Promise链中通用的错误处理场景,即无论哪个环节出错,都可以用相同的逻辑来处理错误。例如,在一个复杂的异步操作链中,无论哪个步骤失败,都统一记录错误日志并向用户显示友好的错误提示。

在每个 then 回调函数中处理错误

  • 原理:在每个 then 回调函数内部,使用 try...catch 语句块来捕获同步错误,并手动处理返回被拒绝的Promise的情况。这样可以针对每个具体的异步操作进行细粒度的错误处理。
  • 适用场景:当不同的异步操作需要不同的错误处理逻辑时使用。比如,在一个文件上传操作的Promise链中,读取文件的步骤和上传文件的步骤可能会出现不同类型的错误,需要分别进行针对性处理。

使用 Promise.allSettled

  • 原理Promise.allSettled 方法接收一个Promise数组作为参数,返回一个新的Promise。当所有输入的Promise都已被解决(resolved或rejected)时,这个新的Promise被解决。它会返回一个包含每个Promise结果(无论是成功还是失败)的数组,通过检查每个结果的 status 属性("fulfilled""rejected")来判断并处理错误。
  • 适用场景:当需要确保所有的Promise都执行完毕,无论它们是成功还是失败,并且需要统一处理所有结果(包括错误)时使用。例如,同时发起多个API请求获取不同的数据,无论哪个请求失败,都要汇总所有请求的结果进行展示。