返回

Promise系列reject后catch/then的详细解析

前端

Promise 的异常处理:深入剖析 reject 后 catch/then 的行为

在 JavaScript 的异步编程世界中,Promise 作为一种优雅的机制,帮助我们管理异步操作和处理潜在错误。Promise.reject() 方法将 Promise 的状态从 pending 转换为 rejected,传递一个错误对象作为参数。当一个 Promise 被 reject,它将无法再变为 fulfilled,任何后续的 then() 或 catch() 处理程序都将被调用。

catch() vs. then()

catch()then() 都可以用于处理 Promise 异常,但它们的行为略有不同:

  • catch(): 只在 Promise 被 reject 时调用。它接收一个参数,即错误对象。
  • then(): 无论 Promise 是 fulfilled 还是 rejected 都会调用。它接收一个函数作为参数,该函数可以处理结果或错误。

调用顺序

当一个 Promise 被 reject 时,它的 then() 和 catch() 处理程序会按照注册顺序依次被调用。这意味着先注册的处理程序将先被调用。

使用场景

  • catch(): 通常用于处理 Promise 中发生的错误,例如网络请求失败或数据库连接错误。
  • then(): 通常用于处理 Promise 中成功的结果,例如从服务器获取数据或完成一个耗时的任务。

错误处理

在 catch() 和 then() 中,我们都可以使用 try...catch 语句来处理错误。如果在 try...catch 语句中捕获到了错误,则可以阻止错误的传播。

示例

const promise = new Promise((resolve, reject) => {
  // 异步操作,可能成功或失败
  if (success) {
    resolve('成功!');
  } else {
    reject(new Error('失败!'));
  }
});

promise
  .then((result) => {
    // 处理成功的 Promise
    console.log(`成功结果:${result}`);
  })
  .catch((error) => {
    // 处理失败的 Promise
    console.log(`失败原因:${error.message}`);
  });

在上面的示例中,我们创建了一个 Promise,该 Promise 可能成功或失败。如果成功,我们使用 then() 处理结果;如果失败,我们使用 catch() 处理错误。

结论

理解 Promise 的 reject、catch 和 then 是掌握 JavaScript 异步编程的关键。通过正确使用这些机制,我们可以优雅地处理异常,编写健壮可靠的代码。

常见问题解答

  1. 如果我同时使用 catch() 和 then(),会发生什么?
    无论 Promise 是 fulfilled 还是 rejected,then() 都会被调用,而 catch() 仅在 rejected 时被调用。

  2. catch() 可以处理未捕获的错误吗?
    否,catch() 只能处理 Promise 拒绝中抛出的错误。

  3. 如果 catch() 中的 try...catch 语句抛出错误,会发生什么?
    这将导致一个新的错误,它将被冒泡到下一个 catch() 处理程序或全局错误处理程序。

  4. 我可以使用 catch() 来处理 Promise 外部的错误吗?
    否,catch() 只能处理 Promise 中的错误。

  5. 如何阻止错误传播到下一个 catch() 处理程序?
    使用 try...catch 语句捕获错误并显式重新抛出它们以阻止它们继续传播。