setTimeout
, вызываемый без значения задержки, просто помещает переданную функцию в очередь для выполнения циклом событий JavaScript .Обычно это следующий тик, хотя в очереди могут быть и другие запланированные события, поэтому функция будет после них.
Разрешение Promise назначается аналогичным образом, помещая его в очередь.Это означает, что setTimeout
будет планировать завершение функции немедленно после завершения обещаний.В свою очередь это означает, что значения p
, p2
и p3
будут ожидающими в текущем цикле цикла событий JavaScript, а затем в конечном состоянии, когда вызывается функция, задержанная на setTimeout
.
Демонстрация хода выполнения программы:
//console.logs from StackOverflow snippets don't print the state of the promise
//you can open the browser developer tools and click the button to run the snippet
//in order to see that output
var p = Promise.all([1,2,3]); //<-- a pending promise is created
p.finally(() => console.log("promise fulfilled", p));
console.log("this call is executed immediately", p); //<-- the same run of the event loop
setTimeout(function() {
console.log("this call is scheduled to execute in the future", p); //<-- to be executed in a subsequent run of the loop.
});