gpt4 book ai didi

javascript - 在某些情况下省略 'await' 是否合法?

转载 作者:可可西里 更新时间:2023-11-01 02:40:04 25 4
gpt4 key购买 nike

我在我的代码中的几个地方使用了 async/await

例如,如果我有这个功能:

async function func(x) {
...
return y;
}

那么我总是这样调用它:

async function func2(x) {
let y = await func(x);
...
}

我注意到在某些情况下,我可以省略 await 并且程序仍会正确运行,所以我不太清楚什么时候必须使用 await 和当我可以放下它的时候。

我得出的结论是,仅在 return 语句中直接删除 await 是“合法的”。

例如:

async function func2(x) {
...
return func(x); // instead of return await func(x);
}

这个结论是否正确,否则,我在这里遗漏了什么?

编辑:

一个小的(但重要的)概念,在下面的任何答案中都没有提到,我刚刚遇到并意识到:

return 语句中放置 await 是不“合法的”,如果被调用的函数可能抛出异常,那么该语句因此在 中执行code>try block 。

例如,删除下面代码中的 await 是“危险的”:

async function func1() {
try {
return await func2();
}
catch (error) {
return something_else;
}
}

原因是 try block 无异常完成,Promise 对象“正常”返回。然而,在任何调用外部函数的函数中,当此 Promise 对象被“执行”时,将发生实际错误并抛出异常。只有使用await,这个异常才会在外层函数中成功处理。否则,责任上升,需要额外的 try/catch 子句。

最佳答案

如果 func 是一个异步函数,那么使用和不使用 await 调用它会有不同的效果。

async function func(x) {
return x;
}

let y = await func(1); // 1
let z = func(1) // Promise (resolves to 1)

省略 await 关键字总是合法的,但这意味着您将不得不以传统方式处理 promise(首先击败 async/await 的要点)。

func(1).then(z => /* use z here */)

如果您的 return 语句使用 await,那么您可以确定如果它抛出错误,它可以在您的函数中被捕获,而不是被调用它的代码捕获。

关于javascript - 在某些情况下省略 'await' 是否合法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47408685/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com