Node JS等待catch块抛出错误中的异步调用

时间:2020-11-10 01:00:57

标签: javascript asynchronous async-await

我对javascript完全陌生,正在学习如何将await与异步功能一起使用。在我的情况下,我试图等待异步功能完成,这是我从catch块调用的。不适用于消息The await operator can only be used with async functions

begin().then( () =>
    console.log("done")
)

async function begin() {
    await shouldFail().then( message =>
        console.log(message)
    ).catch( () => {
        await shouldFail().then( message => // The await here is not working. 
            console.log(message)
        ).catch( message =>
            console.log(message)
        )
    })
}

async function shouldFail(){
    await sleep(1000)
    return new Promise((resolve, reject) => reject('failed'))
}

我可以理解这是可能发生的,因为catch方法可能不是异步的。我试图通过上面的代码简化我的案例。知道何时在catch块内调用的异步函数完成的最佳方法是什么?我希望开始仅在catch块执行后才返回。

3 个答案:

答案 0 :(得分:1)

根据定义:await只能在异步函数中使用。

所以您的嵌套函数也必须异步

async function begin() {
    await shouldFail().then( message =>
        console.log(message)
    ).catch( async () => { // here -----------------
        await shouldFail().then( message => 
            console.log(message)
        ).catch( message =>
            console.log(message)
        )
    })
}

答案 1 :(得分:1)

begin().then( () =>
    console.log("done")
)

async function begin() {
    await shouldFail().then( message =>
        console.log(message)
    ).catch(async () => {  //**Just add a async here**
        await shouldFail().then( message => // This should work now
            console.log(message)
        ).catch( message =>
            console.log(message)
        )
    })
}

async function shouldFail(){
    await sleep(1000)
    return new Promise((resolve, reject) => reject('failed'))
}

答案 2 :(得分:0)

当您使用async / await时,您无需添加then and catch块。

您可以在MDN上了解有关异步/等待的更多信息

使用异步/等待示例代码

begin().then(() =>
    console.log("done")
)
async function begin() {
    try {
        let message = await shouldFail();
        console.log(message)
    } catch (e) {
        try {
            let message = await shouldFail();
            console.log(message)
        } catch (error) {
            console.log(message)
        }
    }
}
async function shouldFail() {
    await sleep(1000)
    return new Promise((resolve, reject) => reject('failed'))
}