no-return-await
禁止不必要的 return await
💡 hasSuggestions
此規則回報的一些問題可以透過編輯器建議手動修正
此規則的最初目的是為了勸阻使用 return await
,以避免額外的微任務。然而,由於 JavaScript 現在以不同的方式處理原生 Promise
,因此不再有額外的微任務。更多技術資訊可以在這篇 V8 部落格文章中找到。
在 async function
內部使用 return await
會使目前的函式保留在呼叫堆疊中,直到正在等待的 Promise 解析完成,代價是在解析外部 Promise 之前產生額外的微任務。return await
也可以在 try/catch 語句中使用,以捕捉來自另一個回傳 Promise 的函式的錯誤。
您可以避免額外的微任務,方法是不等待回傳值,但代價是如果從回傳的 Promise 非同步拋出錯誤,則該函式將不再是堆疊追蹤的一部分。這可能會使偵錯更加困難。
規則詳情
此規則旨在預防由於對 async function
的語意理解不足而可能造成的常見效能危害。
此規則的錯誤程式碼範例
在 Playground 中開啟
/*eslint no-return-await: "error"*/
async function foo() {
return ;
}
此規則的正確程式碼範例
在 Playground 中開啟
/*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 中引入。
延伸閱讀

