在某些情况下省略"等待"是否合法?

goo*_*ion 10 javascript async-await es6-promise

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

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

async function func(x) {
    ...
    return y;
}
Run Code Online (Sandbox Code Playgroud)

然后我总是这样称呼它:

async function func2(x) {
    let y = await func(x);
    ...
}
Run Code Online (Sandbox Code Playgroud)

我注意到在某些情况下,我可以省略await并且程序仍然可以正常运行,因此我无法弄清楚何时必须使用await以及何时可以放弃它.

我已经得出结论,await直接在return语句中删除它是"合法的" .

例如:

async function func2(x) {
    ...
    return func(x); // instead of return await func(x);
}
Run Code Online (Sandbox Code Playgroud)

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

编辑:

一个小的(但很重要的)概念,在我刚刚遇到并实现的任何答案中都没有提到过:

它不是"合法"地掉落await一个内return声明,如果被调用函数可能会抛出异常,因此这种说法是内部执行try块.

例如,删除await下面的代码是"危险的":

async function func1() {
    try {
        return await func2();
    }
    catch (error) {
        return something_else;
    }
}
Run Code Online (Sandbox Code Playgroud)

原因是try块完成没有异常,Promise对象返回"正常".但是,在调用外部函数的任何函数中,当Promise"执行" 该对象时,将发生实际错误并抛出异常.只有在await使用时,才会在外部函数中成功处理此异常.否则,该责任会增加,需要额外的try/ catch条款.

Dan*_*nce 8

如果func是异步函数,则使用和不使用它都会await产生不同的效果.

async function func(x) {
  return x;
}

let y = await func(1); // 1
let z = func(1) // Promise (resolves to 1)
Run Code Online (Sandbox Code Playgroud)

省略await关键字总是合法的,但意味着你必须处理传统风格的承诺(首先要击败异步/等待点).

func(1).then(z => /* use z here */)
Run Code Online (Sandbox Code Playgroud)

如果你的返回语句使用await那么你可以确定如果它抛出错误它可以被捕获到你的函数内部,而不是通过调用它的代码.