版本

require-await

不允許沒有 await 表達式的 async 函式

💡 有建議

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

JavaScript 中的非同步函式在兩個重要方面與其他函式的行為不同

  1. 傳回值永遠是 Promise
  2. 您可以在其中使用 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"*/

async function foo() {
    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 的拒絕處理常式(例如 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 中引入。

資源

變更語言