在承诺初始化之后等待使用

问题描述 投票:2回答:2

我想连接mongoDb并异步执行代码。

async function test() {
    let task = asyncTask() //return a promise
    //function still running
    await task
    //code executed only if task is resolved
}

使用等待是正确的吗?

javascript async-await
2个回答
5
投票

是的,如果您使用等待异步函数,则代码将阻塞,直到promise已解决或失败。您应该在try catch中包装await块以处理任何错误。

async function test() {
    let task = asyncTask()
    //function still running
    try {
        await task
        //code executed only if task is resolved
    } catch (err){
        //Something went wrong
        throw new Error(err);
    }
}

使用async / await具有与promise相同的功能,但只是提供了一种更加同步的代码编写方式。

如果您想将代码重写为承诺,那么它看起来像:

function test() {
    myPromise('some arguments')
    .then(result => console.log(`Task completed: ${result}`);)
    .catch(err => console.error(err));
}

1
投票

异步/ AWAIT

async:在async之前的单词function意味着一个简单的事情:函数总是返回一个promise。

等待:关键字await使JavaScript等待,直到该承诺结算并返回其结果。

这里

  async function test() {
    let task = asyncTask() //return a promise
    //function still running
    await task
    //code executed only if task is resolved
}  

函数执行“暂停”在行(await task)并在承诺结算时恢复,task成为其结果。

让我们强调:await字面上让JavaScript等到承诺结束,然后继续结果。

如果承诺正常解决,则await promise返回result。但如果遭到拒绝,它会抛出error

1.正如在answer中已经说过的那样我们应该使用try..catch来捕捉这个错误

async function test() {
    let task = asyncTask()
    //function still running
    try {
        await task
   } catch (err){
       throw new Error(err);
    }
}

2.如果我们没有try..catch,则异步函数test()调用生成的promise将被拒绝。我们可以附加.catch来处理它:

async function test() {
        let task = asyncTask() //return a promise
        //function still running
        await task
        //code executed only if task is resolved
    } 
 test().catch(//error);

更多如果.catch不在那里,那么我们得到一个未处理的承诺错误。我们可以使用全局事件处理程序捕获此类错误。

© www.soinside.com 2019 - 2024. All rights reserved.