我想连接mongoDb并异步执行代码。
async function test() {
let task = asyncTask() //return a promise
//function still running
await task
//code executed only if task is resolved
}
使用等待是正确的吗?
是的,如果您使用等待异步函数,则代码将阻塞,直到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));
}
异步/ 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
不在那里,那么我们得到一个未处理的承诺错误。我们可以使用全局事件处理程序捕获此类错误。