今天写了一段类似这样的代码
function Sleep(){
return new Promise((resolve, reject)=>{
setTimeout(() => {
reject("failed")
}, 1000);
})
}
async function Test1(){
let ret = await Sleep().catch(err=>{
console.log("err="+err)
});
console.log("ret="+ret)
}
Test1();
Test1()方法中调用了await来处理Sleep()返回的Promise,
我期望的输出是
err=failed
但是实际上输出:
err=failed
ret=undefined
经过一番折腾后,可达预期的代码可以这样写:
async function Test2(){
try{
let ret = await Sleep();
console.log("ret="+ret)
}catch(err){
console.log("err="+err)
}
}
Test2();
事后仔细想想问题出在let ret = await Sleep().catch()这句代码,由于这是一个链式调用,所以当触发了catch调用后,就可以理解为await了catch()返回的这个Promise,即整个表达式的返回值是catch(()=>{})中匿名函数的返回值
async function Test1(){
let ret = await Sleep().catch(err=>{
console.log("err="+err)
return 0; // 增加此句,此处返回0
});
console.log("ret="+ret)
}
Test1();
得到输出:
err=failed
ret=0
本文记录了在使用Promise和await时遇到的一个问题。在NodeJS环境中,由于对await处理Promise链式调用的理解不当,导致实际结果与预期不符。通过修正代码并深入理解await等待的是Promise的结果,包括catch块中的返回值,最终解决了问题,实现了正确的异步控制流程。
6442

被折叠的 条评论
为什么被折叠?



