Help us understand the problem. What is going on with this article?

Promiseのresolveとrejectの両方を呼び出したらどうなってしまうのか?

Promiseは次のサンプルコードように、失敗したらrejectを、成功したらresolveを呼び出すような書き方をする。

new Promise((resolve, reject) => {
  // ...
  if (err) {
    reject(err)
  } else {
    resolve()
  }
})

このサンプルコードは、正常系と異常系でif分岐されており、resolverejectが両方呼ばれる可能性はない。

もしも、resolverejectの両方を呼び出したらどうなるのだろうか?

new Promise((resolve, reject) => {
  reject()
  resolve()
})

普通はこんなことはしないだろうが、Promiseの仕様を知っておくのは良さそうだ。

実験1: resolverejectの順で呼んでみる

実験してみよう。まずは、resolverejectの順で呼び出してみよう。

new Promise((resolve, reject) => {
    resolve()
    reject()
}).then(value => console.log('success'))
  .catch(reason => console.log('failure'))
//=> success

この実行結果は、「success」になり、resolveが尊重されたかたちになった。

実験2: rejectresolveの順で呼んでみる

今度は逆に、rejectのほうを先に呼び出してみることにする。

new Promise((resolve, reject) => {
    reject()
    resolve()
}).then(value => console.log('success'))
  .catch(reason => console.log('failure'))
//=> failure

今度の結果は「failure」になった。rejectのほうが採用されたことが分かる。

結論: 先に呼ばれたほうが採用される

「Promiseのresolverejectの両方を呼び出したらどうなってしまうのか?」の疑問への答えとしては、「先に呼ばれたほうが採用される」ということになりそうだ。

余談: 先勝ちと言っても、処理が中断されるわけではない

ちなみに、resolverejectどちらかが採用されるとは言え、Promiseに渡したexecuterの処理が中断されるわけではない。例えば、下記のコードでは、①でresolveが採用されるが、そのあとの②③の行も実行される。

new Promise((resolve, reject) => {
    resolve() // ①
    console.log('after resolve') // ②
    reject() // ③
}).then(value => console.log('success'))

Learn more

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away