跳至主要內容

沒有浮動 Promise

要求 Promise 樣式的敘述適當地處理。

💡

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

💭

此規則需要 類型資訊 才能執行。

「浮動」Promise 是一種建立時未設定任何程式碼來處理可能會拋出的錯誤的 Promise。浮動 Promise 可能會導致許多問題,例如操作順序錯誤、忽略 Promise 拒絕等等。

當建立 Promise 但未妥善處理時,此規則會報告。處理 Promise 值敘述的有效方法包括

  • awaiting it
  • returning it
  • voiding it
  • 以兩個參數呼叫其 .then()
  • 以一個參數呼叫其 .catch()

此規則也會回報包含 Promise 的陣列建立且未正確處理時。透過使用其中一個 Promise 並行方法以建立單一 Promise 然後按照上述程序處理,是解決此問題的主要方式。這些方法包含

  • Promise.all()
  • Promise.allSettled()
  • Promise.any()
  • Promise.race()
提示

no-floating-promises 只會偵測未處理的 Promise 陳述式。參閱 no-misused-promises 以偵測提供 Promises 給 邏輯 位置(例如 If 陳述式)的程式碼。

.eslintrc.cjs
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);
在遊樂場中開啟

選項

此規則接受以下選項

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();
在遊樂場中開啟

不使用規則時

這個規則可能難以啟用於設定很多浮動 Promise 的大型現有專案。或者,如果你不擔心浮動或錯誤使用的 Promise 導致崩潰,例如:已註冊的全球未處理的 Promise 處理常式,那麼在某些情況下,或許可以安全地不使用這個規則。你可能會考慮在這些特定情況下使用 void 和/或 ESLint disable 註解,而不是完全停用這則規則。

進一步閱讀


類型檢查的 Lint 規則比傳統的 Lint 規則更強大,但同時需要設定 類型檢查的 Lint。如果你在啟用類型檢查的規則後遇到效能下降,請參閱 效能問題排除

資源