跳至主要內容

Promise 函式非同步

要求任何回傳 Promise 的函式或方法標示非同步。

🔧

這項規則報告的某些問題可自動由 --fix ESLint 命令列選項修復.

💭

這條規則需要 類型資訊 來執行。

確保每個函式都能夠只

  • 回傳一個遭到拒絕的 Promise,或
  • 擲出一個 Error 物件。

相反地,非同步、回傳Promise的函式在技術上具有兩種能力。處理這些函式結果的程式碼往往必須處理這兩種情況,這可能會變得複雜。這條規則的做法消除了建立程式碼來處理這兩種情況的需求。

當函式回傳 Promise 和非 Promise 類型的聯集,通常是出錯了––這條規則會標示那些案例。如果這是故意的,請明確設定回傳類型以讓規則通過。

.eslintrc.cjs
module.exports = {
"rules": {
"@typescript-eslint/promise-function-async": "error"
}
};

在操場中嘗試這條規則 ↗

範例

這條規則的程式碼範例

const arrowFunctionReturnsPromise = () => Promise.resolve('value');

function functionReturnsPromise() {
return Promise.resolve('value');
}

function functionReturnsUnionWithPromiseImplicitly(p: boolean) {
return p ? 'value' : Promise.resolve('value');
}
在操場中開啟

選項

此規則接受下列選項

type Options = [
{
/** Whether to consider `any` and `unknown` to be Promises. */
allowAny?: boolean;
/** Any extra names of classes or interfaces to be considered Promises. */
allowedPromiseNames?: string[];
checkArrowFunctions?: boolean;
checkFunctionDeclarations?: boolean;
checkFunctionExpressions?: boolean;
checkMethodDeclarations?: boolean;
},
];

const defaultOptions: Options = [
{
allowAny: true,
allowedPromiseNames: [],
checkArrowFunctions: true,
checkFunctionDeclarations: true,
checkFunctionExpressions: true,
checkMethodDeclarations: true,
},
];

allowAny

是否忽略傳回 `any` 和 `unknown` 的函式。如果您要額外的安全性,請考慮關閉此選項,因為它會讓規則較無法捕捉到 Promise 行為不正確的地方。

使用 `{ "allowAny": false }` 的程式碼範例

const returnsAny = () => ({}) as any;
在操場中開啟

allowedPromiseNames

這個選項允許指定類別或介面的字串名稱,以便同樣地檢查函式,適用於使用非全域內建 `Promise` 撰寫非同步程式碼專案。

使用 `{ "allowedPromiseNames": ["Bluebird"] }` 的程式碼範例

class Bluebird {}

const returnsBluebird = () => new Bluebird(() => {});
在操場中開啟

checkArrowFunctions

是否檢查箭頭函式。預設為 `true`,但可以設定為 `false` 以忽略它們。

checkFunctionDeclarations

是否檢查獨立函式宣告。預設為 `true`,但可以設定為 `false` 以忽略它們。

checkFunctionExpressions

是否檢查內嵌函式表達式。預設為 `true`,但可以設定為 `false` 以忽略它們。

checkMethodDeclarations

是否檢查類別和物件文字中的方法。預設為 `true`,但可以設定為 `false` 以忽略它們。

何時不應使用

針對需要函式永遠都是 `async` 的 API 使用專案啟用此規則可能會很困難。您可以考慮在這些特定情況下,與其完全停用此規則,不如使用 ESLint 停用註解 ,並向依賴項提出問題。


類型檢查的檢查規則比傳統的檢查規則更強大,但需要設定類型檢查檢核。在啟用類型檢查規則後,如果您遇到效能下降問題,請參閱效能疑難排解

資源