eslint/no-async-promise-executor 正しさ
何をするか
非同期関数を Promise の実行関数として使用することを禁止します。
なぜ問題なのか
new Promise コンストラクタは、引数として実行関数を受け取ります。この関数には resolve と reject パラメータがあり、作成された Promise の状態を制御するために使用できます。たとえば:
javascript
const result = new Promise(function executor(resolve, reject) {
readFile("foo.txt", function (err, result) {
if (err) {
reject(err);
} else {
resolve(result);
}
});
});実行関数は async function としても指定できます。しかし、これは多くの場合誤りです。その理由は以下の通りです:
- 非同期の実行関数がエラーをスローした場合、そのエラーは失われてしまい、新たに構築された
Promiseを拒否(reject)する原因になりません。これにより、一部のエラーをデバッグや処理するのが難しくなる可能性があります。 Promiseの実行関数でawaitを使用している場合、これは実際に新しいPromiseコンストラクタを使用する必要がない、または新しいPromiseコンストラクタの範囲を小さくできる可能性があるというサインであることがほとんどです。
例
このルールに違反する不適切なコードの例:
javascript
const foo = new Promise(async (resolve, reject) => {
readFile("foo.txt", function (err, result) {
if (err) {
reject(err);
} else {
resolve(result);
}
});
});
const result = new Promise(async (resolve, reject) => {
resolve(await foo);
});このルールに準拠する正しいコードの例:
javascript
const foo = new Promise((resolve, reject) => {
readFile("foo.txt", function (err, result) {
if (err) {
reject(err);
} else {
resolve(result);
}
});
});
const result = Promise.resolve(foo);使い方
このルールを設定ファイルまたは CLI で有効化するには、次のようにします:
json
{
"rules": {
"no-async-promise-executor": "error"
}
}bash
oxlint --deny no-async-promise-executor