版本

no-return-await

禁止不必要的 return await

💡 有建議

此規則回報的一些問題可透過編輯器的建議 手動修正

此規則已在 ESLint v8.46.0 中棄用,沒有替代規則。此規則最初的意圖是阻止使用 return await,以避免額外的微任務。然而,由於 JavaScript 現在以不同的方式處理原生 Promise,因此不再存在額外的微任務。更多技術資訊可以在這篇 V8 部落格文章中找到。

async function 內部使用 return await 會使目前的函式保留在呼叫堆疊中,直到被等待的 Promise 完成解析,代價是在解析外部 Promise 之前增加一個額外的微任務。return await 也可以在 try/catch 語句中使用,以捕獲從另一個返回 Promise 的函式產生的錯誤。

您可以通過不等待返回值來避免額外的微任務,但如果從返回的 Promise 異步拋出錯誤,則該函式將不再是堆疊追蹤的一部分。這會使除錯更加困難。

規則詳情

此規則旨在防止由於不了解 async function 的語義而可能發生的常見效能風險。

此規則的錯誤程式碼範例

在遊樂場中開啟
/*eslint no-return-await: "error"*/

async function foo() {
    return await bar();
}

此規則的正確程式碼範例

在遊樂場中開啟
/*eslint no-return-await: "error"*/

async function foo1() {
    return bar();
}

async function foo2() {
    await bar();
    return;
}

// This is essentially the same as `return await bar();`, but the rule checks only `await` in `return` statements
async function foo3() {
    const x = await bar();
    return x;
}

// In this example the `await` is necessary to be able to catch errors thrown from `bar()`
async function foo4() {
    try {
        return await bar();
    } catch (error) {}
}

何時不使用

您可能想要關閉此規則的原因有幾個

  • 如果您想使用 await 來表示一個 thenable 的值
  • 如果您不想要避免 return await 的效能優勢
  • 如果您希望函式顯示在堆疊追蹤中(對於除錯目的很有用)

版本

此規則在 ESLint v3.10.0 中引入。

延伸閱讀

資源

更改語言