Это определенная реализация.Спецификация ECMAScript (JavaScript) требует только того, чтобы задания (EnqueueJob
s) для then
обратных вызовов (и ожиданий) выполнялись после синхронного кода JavaScript и по порядку.
Все, что происходит за его пределами ("цикл обработки событий с обратными вызовами ввода-вывода в Node или API-интерфейсах DOM браузера) контролируется платформой.
То есть: - Планирование обратного вызова Promise является частью JavaScript и спецификации ECMAScript.- Другие операции ввода-вывода (такие как таймеры, доступ к файлам, события взаимодействия с пользователем DOM, доступ к сети) определяются хост-платформой , а не JavaScript.Это может быть Node.js или API-интерфейс DOM браузера.
Определена ли реализация одной или двумя очередями.
Я собираюсь выбрать одну реализацию (Node.js).В Node.js (и Chrome) они хранятся в двух разных очередях.
Обратные вызовы Promise «запускаются» через RunMicrotasks
метод V8 Isolate (среда выполнения).Это происходит в next_tick.js
:
function runNextTicks() {
if (tickInfo[kHasScheduled] === 0 && tickInfo[kHasPromiseRejections] === 0)
runMicrotasks();
if (tickInfo[kHasScheduled] === 0 && tickInfo[kHasPromiseRejections] === 0)
return;
internalTickCallback();
}
Это вызывает в очереди V8 для микрозадач.С другой стороны, обратные вызовы запускаются через libuv в node.cc .
. Есть две очереди (libuv и V8), и V8 (очередь микротасков) получает шанс на запуск между каждыми двумяпредметы в libuv.