вызов setImmediate()
показывает нам, что никакие вызовы console.log()
не откладываются до следующей итерации цикла событий
На самом деле они это делают - помните, что обратные вызовы обещания then
являются всегда асинхронный.
Они просто запускаются на другой фазе цикла событий, они ставятся в очередь в разных очередях задач.В частности, для NodeJS, см. Статью https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/ для получения подробностей.
Я ожидал следующего вывода
Не предполагайте ничего о независимых цепочках обещаний.Все, что вы можете и должны ожидать, это то, что B
идет после A
, C
идет после B
, а в другой цепочке E
идет после D
и F
после E
.Они могут произвольно чередоваться 1 - если вы хотите обеспечить порядок, связывайте обещания друг с другом, используя then
.
1: спецификация подробно описывает, как очередиЗадачи обещания работают так, чтобы они были согласованы между различными реализациями движка, но эти детали следует считать не относящимися к делу.