Мы знаем, что обещания - это микрозадачи, и они добавляются в очередь микрозадач, а прослушиватели / таймеры событий - это задачи, поэтому они добавляются в очередь задач. Но как насчет слушателей / таймеров событий, если они находятся внутри функции обещания (которая передается при создании конструктора обещания для обещания). В какую очередь они добавляются?
console.log("script start");
var promise = new Promise(function (resolve, reject) {
setTimeout(function () {
console.log("setTimeout2");
resolve();
}, 0);
});
promise.then(function () {
console.log("promise2");
});
setTimeout(function () {
console.log("setTimeout");
}, 0);
console.log("script end");
Здесь «запуск сценария» - это часть основной задачи, поэтому она выполняется / печатается.
Затем функция обратного вызова обещания передается браузеру, обработчик добавляет ее в очередь микрозадач.
then () передает обратный вызов обработчику браузера, и он выполнится после того, как будет выполнено основное обещание.
setTimeout, который находится вне обещания, добавляется в очередь задач.
Печатается «конец сценария».
Теперь есть микрозадача в очереди микрозадач и задача в очереди задач.
Таким образом, микрозадача будет выполнена первой, поскольку они имеют более высокий приоритет, чем задача.
Но внутри задачи есть таймер.
Мы знаем, что таймеры добавляются в очередь задач. Но тут мне кажется, что в очередь микрозадач добавлен таймер. Потому что, если бы он был добавлен в очередь задач, то «setTimeout2» был бы напечатан позже, потому что в очереди задач уже есть задача, которая печатает «setTimeout». Так что же там на самом деле происходит?