Promise の then のタイミング
- カテゴリ:
- JavaScript
- コメント数:
- Comments: 0
◆ Promise の then は非同期処理になって後回し
◆ Chrome だと REPL のコードの返り値が表示されるより前に実行されてる
◆ Chrome だと REPL のコードの返り値が表示されるより前に実行されてる
Promise の then のタイミングが思ってたのと違いました
こういう場合
a() は非同期処理が入らないで実行されるので 即 then まで行ってから console.log(3) が実行されるのかと思ってました
ですが実際はこうです
[Chrome]
[Firefox]
1 → 3 → 2 という順番です
then はすぐに実行できても非同期に回されるみたいです
setTimeout で 0 を指定するような動きでしょうか
それと あえて Chrome と Firefox を載せましたがお気づきですよね この違い
なんと Chrome では 後回しだけど非同期処理ではないことになってます
undefined というのは REPL で評価した値の返り値です
つまり入力したコードが実行終了したタイミングで表示されます
Firefox では undefined のあとに 2 が来ているので 非同期処理の自然な表示です
ですが Chrome では 2 が後に来ているのに undefined より前です
setTimeout で確認してみると
処理を後回しにすることができても REPL のコード終了直前に処理をさせることは通常 JavaScript だと無理です
内部で Promise は REPL が終了する前に再確認とかあるのかと JavaScript 部分を見てみました
すると InjectedScript は then のコードを実行せずに終了しています
そしてその後に then のコードが実行されました
JavaScript では見えない V8 (C++) の領域ぽいです
まぁ Promise の then は REPL の返り値より先に表示させると覚えておくと Firefox と見比べた時に あれ?っとならずに済むと思います
本当に REPL の最後で 変なとこで割りこまれて実行なんてのは流石にないので実害はないんじゃないかと思います
new Promise(a => {
console.log(1)
a()
}).then(e => console.log(2))
console.log(3)
console.log(1)
a()
}).then(e => console.log(2))
console.log(3)
こういう場合
a() は非同期処理が入らないで実行されるので 即 then まで行ってから console.log(3) が実行されるのかと思ってました
ですが実際はこうです
[Chrome]
1
3
2
< undefined
3
2
< undefined
[Firefox]
1
3
< undefined
2
3
< undefined
2
1 → 3 → 2 という順番です
then はすぐに実行できても非同期に回されるみたいです
setTimeout で 0 を指定するような動きでしょうか
それと あえて Chrome と Firefox を載せましたがお気づきですよね この違い
なんと Chrome では 後回しだけど非同期処理ではないことになってます
undefined というのは REPL で評価した値の返り値です
つまり入力したコードが実行終了したタイミングで表示されます
Firefox では undefined のあとに 2 が来ているので 非同期処理の自然な表示です
ですが Chrome では 2 が後に来ているのに undefined より前です
setTimeout で確認してみると
setTimeout(_ => console.log(1), 0)
console.log(2)
console.log(2)
2
< undefined
1
undefined が間に入っています< undefined
1
処理を後回しにすることができても REPL のコード終了直前に処理をさせることは通常 JavaScript だと無理です
内部で Promise は REPL が終了する前に再確認とかあるのかと JavaScript 部分を見てみました
すると InjectedScript は then のコードを実行せずに終了しています
そしてその後に then のコードが実行されました
JavaScript では見えない V8 (C++) の領域ぽいです
まぁ Promise の then は REPL の返り値より先に表示させると覚えておくと Firefox と見比べた時に あれ?っとならずに済むと思います
本当に REPL の最後で 変なとこで割りこまれて実行なんてのは流石にないので実害はないんじゃないかと思います