Skip to content
← Back to rules

promise/always-return 懸念

何ができるか

then() 内で戻り値を返すことを要求し、読みやすく再利用可能なプロミスチェーンを作成する。
また、then() 内で例外をスローすることも許可しており、これは Promise.reject() を返すのとほぼ同義である。

なぜ問題なのか

破損したプロミスチェーン。
最初の then() コールバック内で関数が呼び出されたが、その結果が返されていない。
これにより、次の then() が、呼び出された関数が完了する前に即座に実行されてしまう。

このルールに違反するコードの例:

javascript
myPromise.then(function (val) {});
myPromise.then(() => {
  doSomething();
});
myPromise.then((b) => {
  if (b) {
    return "yes";
  } else {
    forgotToReturn();
  }
});

このルールに準拠するコードの例:

javascript
myPromise.then((val) => val * 2);
myPromise.then(function (val) {
  return val * 2;
});
myPromise.then(doSomething); // どちらでもよい
myPromise.then((b) => {
  if (b) {
    return "yes";
  } else {
    return "no";
  }
});

設定

このルールは以下のプロパティを持つ設定オブジェクトを受け入れます。

ignoreAssignmentVariable

type: string[]

default: ["globalThis"]

このルールに { ignoreAssignmentVariable: [] } というオプションを渡すことで、プロミスチェーン内の最後の then() コールバックがグローバル変数への代入を行っても警告が出ないようになります。デフォルト値は ["globalThis"] です。

javascript
/* promise/always-return: ["error", { ignoreAssignmentVariable: ["globalThis"] }] */

// OK
promise.then((x) => {
  globalThis = x;
});

promise.then((x) => {
  globalThis.x = x;
});

// OK
promise.then((x) => {
  globalThis.x.y = x;
});

// NG
promise.then((x) => {
  anyOtherVariable = x;
});

// NG
promise.then((x) => {
  anyOtherVariable.x = x;
});

// NG
promise.then((x) => {
  x();
});

ignoreLastCallback

type: boolean

default: false

このルールに { ignoreLastCallback: true } というオプションを渡すことで、プロミスチェーン内の最後の then() コールバックが return を持たなくても警告が出ないようになります。デフォルト値は false です。

javascript
// OK
promise.then((x) => {
  console.log(x);
});
// OK
void promise.then((x) => {
  console.log(x);
});
// OK
await promise.then((x) => {
  console.log(x);
});

promise
  // NG
  .then((x) => {
    console.log(x);
  })
  // OK
  .then((x) => {
    console.log(x);
  });

// NG
const v = promise.then((x) => {
  console.log(x);
});
// NG
const v = await promise.then((x) => {
  console.log(x);
});
function foo() {
  // NG
  return promise.then((x) => {
    console.log(x);
  });
}

使用方法

このルールを有効化するには、設定ファイルまたは CLI で以下のように使用できます:

json
{
  "plugins": ["promise"],
  "rules": {
    "promise/always-return": "error"
  }
}
bash
oxlint --deny promise/always-return --promise-plugin

参照