◆ Promise の then は非同期処理になって後回し
◆ Chrome だと REPL のコードの返り値が表示されるより前に実行されてる 

Promise の then のタイミングが思ってたのと違いました
new Promise(a => {
console.log(1)
a()
}).then(e => console.log(2))
console.log(3)

こういう場合
a() は非同期処理が入らないで実行されるので 即 then まで行ってから console.log(3) が実行されるのかと思ってました
ですが実際はこうです

[Chrome]
1
3
2
< undefined

[Firefox]
1
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)
2
< undefined
1
undefined が間に入っています

処理を後回しにすることができても REPL のコード終了直前に処理をさせることは通常 JavaScript だと無理です
内部で Promise は REPL が終了する前に再確認とかあるのかと JavaScript 部分を見てみました

すると InjectedScript は then のコードを実行せずに終了しています
そしてその後に then のコードが実行されました

JavaScript では見えない V8 (C++) の領域ぽいです
まぁ Promise の then は REPL の返り値より先に表示させると覚えておくと Firefox と見比べた時に あれ?っとならずに済むと思います

本当に REPL の最後で 変なとこで割りこまれて実行なんてのは流石にないので実害はないんじゃないかと思います