Как «return Promise.resolve ()» влияет на цикл обработки событий JavaScript? [Дубликат]

    

На этот вопрос уже есть ответ здесь:

    

Я уже некоторое время использую Javascript и понимаю, как работает цикл обработки событий javascript. Тем не менее, я столкнулся с делом, которое не имеет для меня никакого смысла. Рассмотрим следующий код:

setTimeout(()=> console.log('1'));
Promise.resolve('whatever').then(()=>console.log('2'));
console.log('3');

Я ожидал этого вывода:

  

3
  1
  2

Однако я запускаю его на консоли chrome js и получаю следующее:

  

3
  2
  1

Вопрос: «Promise.resolve (). then (fn)» не должен ни немедленно вызывать функцию, ни вставлять процедуру выполнения функции в конец цикла обработки событий - как работает метод setTimeout - я что-то упускаю?

4 голоса | спросил moatazelmohtaseb 8 Maypm18 2018, 18:28:59

2 ответа


0
Браузеры реализуют несколько очередей заданий /заданий.Спецификация требует реализации для поддержки двух очередей :ScriptQueuePromiseQueueСкорее всего, существует TimerQueue (очередь задач HTML DOM), которая также поддерживает спецификацию таймера HTML DOM уровня 2.Каждая из этих очередей FIFO заполняется во время выполнения и в конечном итоге является очередью цикла событий .Следуя вашему примеру кода:Строка 1 выдвигает (скорее всего) TimerQueue (очередь задач HTML DOM)Строка 2 выдвигается на PromiseQueueСтрока 3 помещается в стек и выполняется немедленно (до завершения)Как только стек пуст, каждая очередь опустошается, пока не опустеетВ вашем примере очередь Promise сначала очищается, а затем - TimerQueue.Это может быть дополнительно продемонстрировано, немного расширив ваш пример:Следует отметить, что порядок исполнения не гарантируется.Спецификация не определяет порядок выполнения очередей:Эта спецификация не определяет порядок обслуживания нескольких очередей заданий.Реализация ECMAScript может переплетать оценку FIFO записей PendingJob очереди заданий с оценкой записей PendingJob одной или нескольких других очередей заданий.РЕДАКТИРОВАТЬПосле обсуждения (ниже) с Берги я указал, что реализации браузера, вероятно, также создают другие очереди.Наиболее вероятной очередью, связанной с этим сообщением, будет TimerQueue в качестве очереди задач, в которой хранятся заданные таймером задачи HTML DOM.
ответил Randy Casburn 8 Maypm18 2018, 20:07:51
0
setTimeout ведет себя к тонкому набору правил.Например, в нескольких браузерах минимальное время ожидания составляет 4 мс, а не 0 мс .Вы правы в том, что Обещание не будет выполнено немедленно, но будет ожидать запуска чистого стека.Есть также хитрости, такие как добавление тега для принудительного столкновения с вершиной цикла событий.Смотрите setImmediate polyfill для браузеров
ответил AnilRedshift 8 Maypm18 2018, 19:10:23

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132