我在我的代码中的几个地方使用了 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/