2 回答
TA贡献1799条经验 获得超9个赞
您是从 Promise 回调中抛出错误setTimeout,而不是从 Promise 回调中抛出错误。与任何其他计时器回调一样,没有任何东西可以处理该错误,它将直接进入浏览器的主机代码,这可能会将其转储到控制台。
如果您想拒绝返回的承诺,请使用reject:
function messup() {
var promise = new Promise(function(resolve, reject){
setTimeout(function() {
reject(new Error("Thrown from messup()"));
resolve('hello from messup function'); // This line is pointless now
}, 1000);
});
return promise;
}
如果您希望捕获计时器回调中的任何同步错误并将其传递给reject,您可以使用try/catch来实现:
function messup() {
var promise = new Promise(function(resolve, reject){
setTimeout(function() {
try {
throw new Error("Thrown from messup()");
resolve('hello from messup function'); // This line will never be reached
} catch (e) {
reject(e);
}
}, 1000);
});
return promise;
}
TA贡献1856条经验 获得超11个赞
Try-catch 与 一起使用时,await专门寻找要履行或拒绝的承诺。
如果您拒绝承诺,而不是抛出与承诺的解决方案无关的错误(如您目前的情况),它将通过您当前的设置捕获。
需要明确的是,您当前抛出的错误不会以任何方式插入到您正在运行的异步操作中。
function messup() {
var promise = new Promise(function(resolve, reject){
setTimeout(function() {
reject("Thrown from messup()"); //<-- do this instead
}, 1000);
});
return promise;
}
进一步阅读:我在 async/await 指南中详细介绍了async/await错误处理。
添加回答
举报