Dlaczego tak
Najpierw wykonuje się cały kod synchroniczny, czyli wypisanie A i D. Potem pętla zdarzeń obsługuje kolejkę mikrozadań, do której trafia funkcja z then() obietnicy, więc pojawia się C. Dopiero na końcu wykonywane jest makrozadanie z setTimeout – nawet z opóźnieniem 0 ms – i wypisuje B, dlatego kolejność A D B C jest błędna.