require-await
禁止沒有 await
表達式的 async 函數
💡 hasSuggestions
此規則回報的一些問題可以透過編輯器建議手動修正
JavaScript 中的非同步函數行為與其他函數在兩個重要方面有所不同
- 傳回值永遠是
Promise
。 - 您可以在其中使用
await
運算子。
使用非同步函數的主要原因通常是為了使用 await
運算子,例如這樣
async function fetchData(processDataItem) {
const response = await fetch(DATA_URL);
const data = await response.json();
return data.map(processDataItem);
}
不使用 await
的非同步函數可能不需要是非同步函數,並且可能是非預期的重構結果。
注意:此規則會忽略 async generator 函數。這是因為 generator 函數是 yield 而不是傳回值,並且 async generator 函數可能會 yield 另一個 async generator 函數的所有值,而實際上永遠不需要使用 await。
規則詳情
此規則會警告沒有 await
表達式的 async 函數。
此規則的錯誤程式碼範例
在遊樂場開啟
/*eslint require-await: "error"*/
() {
doSomething();
}
bar(async () {
doSomething();
});
此規則的正確程式碼範例
在遊樂場開啟
/*eslint require-await: "error"*/
async function foo() {
await doSomething();
}
bar(async () => {
await doSomething();
});
function baz() {
doSomething();
}
bar(() => {
doSomething();
});
// Allow empty functions.
async function noop() {}
何時不該使用
非同步函數旨在與 Promise 協同運作,以便拋出錯誤將導致呼叫 Promise 的 rejection 處理器 (例如 catch()
)。例如
async function fail() {
throw new Error("Failure!");
}
fail().catch(error => {
console.log(error.message);
});
在這種情況下,fail()
函數拋出一個錯誤,旨在稍後由指定的 catch()
處理器捕獲。將 fail()
函數轉換為同步函數將需要重構對 fail()
的呼叫,以使用 try-catch
語句而不是 Promise。
如果您為了此目的在非同步函數內部拋出錯誤,那麼您可能需要停用此規則。
相關規則
版本
此規則在 ESLint v3.11.0 中引入。