Skip to content

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();

Site developed by Aomd.