Promise 函式非同步
要求任何回傳 Promise 的函式或方法標示非同步。
這項規則報告的某些問題可自動由 --fix
ESLint 命令列選項修復.
這條規則需要 類型資訊 來執行。
確保每個函式都能夠只
- 回傳一個遭到拒絕的 Promise,或
- 擲出一個 Error 物件。
相反地,非非同步
、回傳Promise
的函式在技術上具有兩種能力。處理這些函式結果的程式碼往往必須處理這兩種情況,這可能會變得複雜。這條規則的做法消除了建立程式碼來處理這兩種情況的需求。
當函式回傳 Promise 和非 Promise 類型的聯集,通常是出錯了––這條規則會標示那些案例。如果這是故意的,請明確設定回傳類型以讓規則通過。
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');
}
在操場中開啟const arrowFunctionReturnsPromise = async () => Promise.resolve('value');
async function functionReturnsPromise() {
return Promise.resolve('value');
}
// An explicit return type that is not Promise means this function cannot be made async, so it is ignored by the rule
function functionReturnsUnionWithPromiseExplicitly(
p: boolean,
): string | Promise<string> {
return p ? 'value' : Promise.resolve('value');
}
async 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 }` 的程式碼範例
- ❌ 不正確
- ✅ 正確
allowedPromiseNames
這個選項允許指定類別或介面的字串名稱,以便同樣地檢查函式,適用於使用非全域內建 `Promise` 撰寫非同步程式碼專案。
使用 `{ "allowedPromiseNames": ["Bluebird"] }` 的程式碼範例
- ❌ 不正確
- ✅ 正確
checkArrowFunctions
是否檢查箭頭函式。預設為 `true`,但可以設定為 `false` 以忽略它們。
checkFunctionDeclarations
是否檢查獨立函式宣告。預設為 `true`,但可以設定為 `false` 以忽略它們。
checkFunctionExpressions
是否檢查內嵌函式表達式。預設為 `true`,但可以設定為 `false` 以忽略它們。
checkMethodDeclarations
是否檢查類別和物件文字中的方法。預設為 `true`,但可以設定為 `false` 以忽略它們。
何時不應使用
針對需要函式永遠都是 `async` 的 API 使用專案啟用此規則可能會很困難。您可以考慮在這些特定情況下,與其完全停用此規則,不如使用 ESLint 停用註解 ,並向依賴項提出問題。
類型檢查的檢查規則比傳統的檢查規則更強大,但需要設定類型檢查檢核。在啟用類型檢查規則後,如果您遇到效能下降問題,請參閱效能疑難排解。