Skip to content
← Back to rules

eslint/no-async-promise-executor 正しさ

This rule is turned on by default.

何をするか

非同期関数を Promise の実行関数として使用することを禁止します。

なぜ問題なのか

new Promise コンストラクタは、引数として実行関数を受け取ります。この関数には resolvereject パラメータがあり、作成された 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

参照