沒有浮動 Promise
要求 Promise 樣式的敘述適當地處理。
延伸 "plugin:@typescript-eslint/recommended-type-checked"
in an ESLint configuration enables this rule.
此規則報告的一些問題可由編輯器手動修正 建議.
此規則需要 類型資訊 才能執行。
「浮動」Promise 是一種建立時未設定任何程式碼來處理可能會拋出的錯誤的 Promise。浮動 Promise 可能會導致許多問題,例如操作順序錯誤、忽略 Promise 拒絕等等。
當建立 Promise 但未妥善處理時,此規則會報告。處理 Promise 值敘述的有效方法包括
await
ing itreturn
ing itvoid
ing it- 以兩個參數呼叫其
.then()
- 以一個參數呼叫其
.catch()
此規則也會回報包含 Promise 的陣列建立且未正確處理時。透過使用其中一個 Promise 並行方法以建立單一 Promise 然後按照上述程序處理,是解決此問題的主要方式。這些方法包含
Promise.all()
Promise.allSettled()
Promise.any()
Promise.race()
no-floating-promises
只會偵測未處理的 Promise 陳述式。參閱 no-misused-promises
以偵測提供 Promises 給 邏輯 位置(例如 If 陳述式)的程式碼。
module.exports = {
"rules": {
"@typescript-eslint/no-floating-promises": "error"
}
};
在遊樂場體驗此規則 ↗
範例
- ❌ 不正確
- ✅ 正確
const promise = new Promise((resolve, reject) => resolve('value'));
promise;
async function returnsPromise() {
return 'value';
}
returnsPromise().then(() => {});
Promise.reject('value').catch();
Promise.reject('value').finally();
[1, 2, 3].map(async x => x + 1);
在遊樂場中開啟const promise = new Promise((resolve, reject) => resolve('value'));
await promise;
async function returnsPromise() {
return 'value';
}
void returnsPromise();
returnsPromise().then(
() => {},
() => {},
);
Promise.reject('value').catch(() => {});
await Promise.reject('value').finally(() => {});
await Promise.all([1, 2, 3].map(async x => x + 1));
在遊樂場中開啟選項
此規則接受以下選項
type Options = [
{
allowForKnownSafePromises?: (
| {
from: 'file';
name: [string, ...string[]] | string;
path?: string;
}
| {
from: 'lib';
name: [string, ...string[]] | string;
}
| {
from: 'package';
name: [string, ...string[]] | string;
package: string;
}
| string
)[];
/** Whether to ignore async IIFEs (Immediately Invoked Function Expressions). */
ignoreIIFE?: boolean;
/** Whether to ignore `void` expressions. */
ignoreVoid?: boolean;
},
];
const defaultOptions: Options = [
{ ignoreVoid: true, ignoreIIFE: false, allowForKnownSafePromises: [] },
];
ignoreVoid
此選項預設為 true
,允許您停止回報已使用 void 算子消耗的 Promise。這可能是明確標記 Promise 意圖上並未等待的理想方式。
針對設定為 { ignoreVoid: true }
的此規則的正確程式碼範例
async function returnsPromise() {
return 'value';
}
void returnsPromise();
void Promise.reject('value');
在遊樂場中開啟如果將此選項設定為 true
,而且正在使用 no-void
,您應該開啟 allowAsStatement
選項。
ignoreIIFE
此選項讓您略過檢查非同步 IIFE(立即呼叫函式表達式)。
針對設定為 { ignoreIIFE: true }
的此規則的正確程式碼範例
await (async function () {
await res(1);
})();
(async function () {
await res(1);
})();
在遊樂場中開啟allowForKnownSafePromises
此選項允許將特定類型標記為「安全」,以為浮動狀態。例如,當您使用 API 會回傳 Promise 的函式庫時,且函式庫安全地處理拒絕時,您可能需要執行此操作。
此選項會採用指定類型規格的陣列,且將其視為安全。陣列中的每一項目都必須包含下列其中一種形式
- 檔案中定義的型別(
{ from: "file", name: "Foo", path: "src/foo-file.ts" }
,其中path
是相對於專案根目錄的選用路徑) - 預設函式庫中的型別(
{ from: "lib", name: "PromiseLike" }
) - 套件中的型別(
{ from: "package", name: "Foo", package: "foo-lib" }
,這也適用於在 typings 套件中定義的型別)。
有關這則規則的程式碼範例為
{
"allowForKnownSafePromises": [
{ "from": "file", "name": "SafePromise" },
{ "from": "lib", "name": "PromiseLike" },
{ "from": "package", "name": "Bar", "package": "bar-lib" }
]
}
- ❌ 不正確
- ✅ 正確
let promise: Promise<number> = Promise.resolve(2);
promise;
function returnsPromise(): Promise<number> {
return Promise.resolve(42);
}
returnsPromise();
在遊樂場中開啟// promises can be marked as safe by using branded types
type SafePromise = Promise<number> & { __linterBrands?: string };
let promise: SafePromise = Promise.resolve(2);
promise;
function returnsSafePromise(): SafePromise {
return Promise.resolve(42);
}
returnsSafePromise();
在遊樂場中開啟不使用規則時
這個規則可能難以啟用於設定很多浮動 Promise 的大型現有專案。或者,如果你不擔心浮動或錯誤使用的 Promise 導致崩潰,例如:已註冊的全球未處理的 Promise 處理常式,那麼在某些情況下,或許可以安全地不使用這個規則。你可能會考慮在這些特定情況下使用 void
和/或 ESLint disable 註解,而不是完全停用這則規則。
相關
進一步閱讀
- MDN「使用 Promise」文件。請特別注意有關 Promise 拒絕事件 和 組合 的部分。
類型檢查的 Lint 規則比傳統的 Lint 規則更強大,但同時需要設定 類型檢查的 Lint。如果你在啟用類型檢查的規則後遇到效能下降,請參閱 效能問題排除。