В HTML-терминах event loop для страницы или набора страниц из того же домена может иметь несколько task queues. Задачи из того же task source всегда идут в одну очередь, при этом браузер выбирает, какую очередность задач использовать следующим образом.
Задачи для запуска обратных вызовов таймера поступают из timer task source и идут в одной очереди. Назовем эту очередь задачей очереди «A».
Спецификация ECMAscript 2015 (ES6) требует выполнения задач для выполнения обратных вызовов реакции Promise для формирования собственной очереди заданий, которая называется "PromiseJobs". Спецификации ECMAscript и HTML не используют один и тот же язык, поэтому давайте условно приравняем ECMA «Promise Job queue» с HTML очередью задач «B» в браузере - по крайней мере, другая очередь для той, которая используется таймерами.
Теоретически браузер может выбирать задачи из любой очереди A или B, но на практике очередь задач обещания получает более высокий приоритет и будет пуста до того, как будет запущен обратный вызов таймера.
Именно поэтому «h» заносится в журнал последним. Promise then
призывает выполнять выполненные обещания разместить задания в очереди обещаний, которые выполняются с более высоким приоритетом, чем обратные вызовы по таймеру. Очередь обещаний становится пустой после того, как выполнено console.log(3)
, что позволяет выполнить обратный вызов таймера.
Расширенный
ECMAScript опекуны решили не использовать терминологию HTML5 или описание очередей задач в их спецификации, потому что ECMAScript может работать в нескольких средах, чем просто HTML-браузеров.
Собственная реализация очередей обещаний может использовать очередь «микрозадачей» вместо отдельной целевой очереди задач обещания. Задачи с микро-очередью запускаются только после текущего потока сценариев, и все задачи, ранее добавленные в микро-очередь, завершены.
Деталь очередности микрозадачей не требуется для понимания обещаний.
Promise polyfills для браузеров, которые не имеют поддержки для обещаний (все версии IE и т. Д.), Могут использовать таймеры и не вести себя точно так же, как нативные реализации, когда речь идет о порядке обещаний и обратных вызовов по таймеру.
Promise является асинхронными - даже встроенным синхронным ищут код, как это, .then вызываются асинхронно - это то, что обещает сделать –