Обратный вызов
A .then
выполняется в микрозадаче, которая выполняется только после завершения синхронного кода, выполняемого в данный момент. Здесь синхронный код инициализирует два Обещания, которые разрешаются немедленно, с Promise.resolve
.
Микрозадачи разрешаются по порядку, поэтому в конце сценария в очереди находятся две микрозадачи: первая, которая была помещена в очередь было () => console.log(1)
, так что сначала регистрируется. В этот момент Обещание 1
разрешено, поэтому следующий .then
(2
) был помещен в очередь для микропроцессора. Вторым, который был помещен в очередь, был () => console.log(4)
, так что он заносится в журнал вторым, а 5
помещается в очередь для микрозадач. Затем 2
запускается и помещает свой следующий .then
в очередь (3), затем 4
запускается и помещает свой следующий .then
(6
) в очередь. Et c.
// queue:
[1, 4]
// 1 gets logged
// 2 gets pushed
[4, 2]
// 4 gets logged
// 5 gets pushed
[2, 5]
// 2 gets logged
// 3 gets pushed
[5, 3]
...
Если вы ожидали полного разрешения всей цепочки Обещания первого Обещания, прежде чем перейти ко второму Promise.resolve
, все они будут работать в порядке, как вы ожидаете :
(async () => {
await Promise
.resolve()
.then(() => console.log(1))
.then(() => console.log(2))
.then(() => console.log(3));
await Promise
.resolve()
.then(() => console.log(4))
.then(() => console.log(5))
.then(() => console.log(6));
})();
Вышеуказанное происходит потому, что Обещание, созданное цепочкой обещаний .resolve().then( ...)
, разрешится только после того, как разрешится final Обещание в цепочке, то есть после регистрации 3
.