等待和运算符优先级

使用 await 关键字时,必须牢记运算符的优先级。

想象一下,我们有一个异步函数调用另一个异步函数 getUnicorn(),它返回一个 Promise,它解析为类 Unicorn 的一个实例。现在我们想要使用该类的 getSize() 方法获得独角兽的大小。

看下面的代码:

async function myAsyncFunction() {
    await getUnicorn().getSize();
}

乍一看,它似乎有效,但事实并非如此。由于运算符优先级,它等同于以下内容:

async function myAsyncFunction() {
    await (getUnicorn().getSize());
}

这里我们尝试调用 Promise 对象的 getSize() 方法,这不是我们想要的。

相反,我们应该使用括号来表示我们首先要等待独角兽,然后调用结果的 getSize() 方法:

async function asyncFunction() {
    (await getUnicorn()).getSize();
}

当然。在某些情况下,以前的版本可能有效,例如,如果 getUnicorn() 函数是同步的,但 getSize() 方法是异步的。