1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

JSのPromiseではresolve, rejectでは処理が終わらないという話

Last updated at Posted at 2024-02-02

resolve, rejectでは処理が終わらず、returnの代わりには使えないため注意が必要です。

例えば以下のコードを実行すると、どうなるでしょうか?

const flag = true;
const promise = new Promise((resolve, reject) => {
  if(flag) {
    console.log("成功への道");
    resolve("成功!");
  }
  console.log("失敗への道");
  reject("失敗");
});

promise
.then((value)=>console.log(`promise関数実行完了:${value}`))
.catch((value)=>console.log(`promise関数実行失敗:${value}`));

consoleには次のように表示されます。

成功への道
失敗への道
promise関数実行完了:成功!

resolveした後も処理は止まらず、reject関数も呼ばれてしまいます。

ただし、resolve,reject関数は一度呼ばれた後、状態変化しないので
catchに落ちることはありません。(参考:https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Promise/resolve#%E8%BF%94%E5%80%A4)

以下のようなコードを実行したとしても

const promise = new Promise((resolve, reject) => {
    console.log("処理開始");
    resolve("成功1");
    reject("失敗1");
    resolve("成功2");
    reject("失敗2");
    console.log("処理終了");
});

promise
.then((value)=>console.log(`promise関数実行完了:${value}`))
.catch((value)=>console.log(`promise関数実行失敗:${value}`));

consoleには次のように表示され、最初に実行したresolve関数の値(成功1)のみ返ります。

処理開始
処理終了
promise関数実行完了:成功1

resolveした後、処理を終わらせるには、明示的にreturnする

const flag = true;
const promise = new Promise((resolve, reject) => {
  if(flag) {
    console.log("成功への道");
    resolve("成功!");
    return;
  }
  console.log("失敗への道");
  reject("失敗");
});

promise
.then((value)=>console.log(`promise関数実行完了:${value}`))
.catch((value)=>console.log(`promise関数実行失敗:${value}`));

もしくはif elseを使いresolveとrejectが排他的に行われるようにする必要があります。

const flag = true;
const promise = new Promise((resolve, reject) => {
  if(flag) {
    console.log("成功への道");
    resolve("成功!");
  }else {
    console.log("失敗への道");
    reject("失敗");
  }

});

promise
.then((value)=>console.log(`promise関数実行完了:${value}`))
.catch((value)=>console.log(`promise関数実行失敗:${value}`));
1
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?