版本

require-await

禁止沒有 await 表達式的 async 函數

💡 hasSuggestions

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

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 的 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 中引入。

資源

變更語言