Сколько времени разрешенные Обещания занимают, чтобы войти в очередь задач? - PullRequest
0 голосов
/ 25 августа 2018

Я все еще пытаюсь выяснить цикл событий и когда точно все помечается / когда обрабатываются очереди задач.

console.log('start');

Promise.resolve().then(function() {
  console.log('promise');
});

console.log('end');

Это выводит следующее:

> "start"
> "end"
> "promise"

Разве обещание не должно разрешиться сразу, и, следовательно, стек вызовов будет пустым сразу после (до того, как будет напечатано «end»), и, таким образом, обратный вызов будет обработан как задача, прежде чем будет напечатано «end»?

IЯ явно что-то здесь упускаю из-за а) когда решенные обратные вызовы Promise добавляются в очередь задач или б) когда задачи обрабатываются в цикле событий.

Ответы [ 2 ]

0 голосов
/ 25 августа 2018

Проблема заключалась в том, что я считал, что стек очищен после немедленного разрешения Promise, но на самом деле стек на этом этапе не . Можно представить, что весь блок кода выполняется как функция main() программы C, чтобы провести аналогию C.

Таким образом, поскольку стек не очищен, несмотря на то, что микрозадача, находящаяся сейчас в очереди обратных вызовов, ожидает обработки, она не будет обработана до тех пор, пока не завершится весь синхронный код JS в основном потоке.

0 голосов
/ 25 августа 2018

Используя терминологию, которую вы использовали. Очереди задач выполняются, когда выполняется только программный код, то есть когда весь синхронный код завершил выполнение. Ваш код гарантированно выполняется именно в таком порядке.

Они запускаются перед циклом событий (это "микрозадачи"), поэтому ваш then выполняется перед любым setTimeout, например.

...