当promise被拒绝时, await没有在变量中存储数据



我使用了一个async函数来等待promise的结算并将结果存储在一个变量中。但它并不是在承诺被拒绝的情况下储存。坚定承诺是坚强的结果,拒绝承诺则不是坚强的结果。如有任何帮助,我将不胜感激。

async function umar() {
let somevar = false;
let myPromise = new Promise((resolve, reject) => {
if (somevar === true) {
console.log('I am resolved');   
resolve('resolved')
}
else {
console.log('I am rejected.')
reject('rejected')
}
})
let myprom = await myPromise
console.log(myprom)
return myprom
}
let a = umar()
a.then((value)=>{
console.log(value)
},()=>{console.log('I got an error.')})

我期望await在两种情况下(当promise被拒绝和resolve时)都将值存储在变量中,但在promise被拒绝时它没有这样做。

这就是await的工作原理。当承诺被拒绝时,它是throws,如果你想在本地看到错误,你必须在本地用try/catch捕获错误。当myPromise拒绝时,您的赋值语句let myprom = await myPromise将不会执行。

承诺拒绝必须在.catch()中被捕获,第二次回调到.then(fn1, fn2),或者,如果在await周围使用awaittry/catch(或者有时您让拒绝从async函数传播出去,调用者可以捕获拒绝。

在您的umar()函数中,当myPromise拒绝时,该函数将抛出await myPromise点,并且返回的异步父函数的承诺将以myPromise拒绝的相同错误拒绝(因为async函数自动捕获throw并将其转换为拒绝或其承诺)。您可以在await周围包装try/catch来捕获错误,或者在您的代码示例中,您可以在调用umar()的地方捕获您已经在做的错误。如果您在那里记录实际的错误,您将看到您期望的错误:

let a = umar();
a.then((value) => {
console.log(value)
}, (err) => {
// log the error 
console.log('I got an error.', err);
});

最新更新