【JavaScript】Promise()でresolve/rejectをreturnのように使ってた話

Promiseresolve/rejectしたら、そこで処理が中断されて、then/catchに飛ぶと思ってたが、どうやら違うようだ。

resolve/rejectでは、処理の中段は発生しない。

new Promise((resolve, reject) => {
    console.log('start')
    resolve()
    console.log('end')
})
    .then(() => console.log('then'))
    .catch(() => console.log('catch'))

こういうコード書いたときに、出力結果は、

// こうなる想定で上のコードを書いてる
start
then

// でも実際はこう
start
end
then

reject()catchに飛ぶ場合でも同様の挙動をとる。

それでも、resolve/rejectで処理を中断して、 then/catchに飛んで欲しい

resolve/rejectするときに、returnすればいいだけだった。

new Promise((resolve, reject) => {
    console.log('start')
    return resolve()
    console.log('end')
})
    .then(() => console.log('then'))
    .catch(() => console.log('catch'))
start
then

おまけ:resolve/rejectで処理が中断しないなら…

こういうコード書いたら、どうなるんだろ

new Promise((resolve, reject) => {
    console.log('start')
    resolve()
    console.log('naka')
    reject()
    console.log('end')
})
    .then(() => console.log('then'))
    .catch(() => console.log('catch'))

実際に試してみると、こうなった。

start
naka
end
then

resolve()が実行された時点で、then行きが決まり、そのあとのreject()は無視されるようだ。

タイトルとURLをコピーしました