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

标签 javascript async-await es6-promise

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

相关文章:

javascript - 在 Promise 构造函数中解析 Promise 是否有效?

Javascript 异步/等待程序顺序

javascript - Jquery不显示从db获取的值

javascript - 取消选择数据表隐藏复选框

c# - 如何创建 Async ActionResult 以创建用于以下轮询逻辑的 async-await 模式?

javascript - 如何在nodeJS的forEach中正确使用async

javascript - 获取与之关联的范围和颜色 - Chroma.js

javascript - CSS 水平导航菜单列表对齐

javascript - 在函数中解决 await

ecmascript-6 - 我什么时候应该直接调用 Promise.resolve() ?