Promise 对象拥有两个方法 then 和 catch,分别是用来接收 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("错误处理:请输入正确的数据");
});