等待和運算子優先順序

使用 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() 方法是非同步的。