Promise错误处理的坑

602 阅读1分钟

Promise 对象拥有两个方法 thencatch,分别是用来接收 Promise 成功信息和报错信息。

在 Promise 中的异步代码报错,catch 方法无法自动捕获到错误信息,错误信息会被抛出到全局,导致自定义的错误处理无法正常运行

下面是一个常见的例子:

// 切割字符串方法
var p1 = function (str) {
  return new Promise((resolve) => {
    setTimeout(() => {
      console.log("打印字符串长度:" + str.split(""));
      resolve("success");
    }, 2000);
  });
};

p1(123)
  .then((value) => {
    console.log(value);
  })
  .catch((error) => {
    // 自定义的错误提示,但错误无法捕获,导致用户没有收到提示
    alert("错误处理:请输入正确的数据");
  });

上面这段代码,我们所期待的结果是,页面弹出一个错误提示框,但是 catch 无法自动捕捉异步中的错误,错误被抛出到全局变量,导致提示代码无法正常运行。

下面是解决方案,但是看起来不是很优雅:

// 切割字符串方法
var p1 = function (str) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      try {
        console.log("打印字符串长度:" + str.split(""));
        resolve("success");
      } catch (e) {
        reject();
      }
    }, 2000);
  });
};

p1(123)
  .then((value) => {
    console.log(value);
  })
  .catch((error) => {
    // 自定义的错误提示,但错误无法捕获,导致用户没有收到提示
    alert("错误处理:请输入正确的数据");
  });