Где асинхронные обещания хранятся в JavaScript перед выполнением? - PullRequest
0 голосов
/ 25 декабря 2018

Я использую JavaScript уже несколько лет и недавно провел много исследований концепций JavaScript высокого уровня.Я узнал, что обратные вызовы функций хранятся в очереди, обычно называемой очередью событий или очередью сообщений, и именно это позволяет JavaScript работать асинхронно.

Из многих источников я узнал, что обещания выполняютсядо обратных вызовов в очереди событий.Мои личные эксперименты также подтверждают это поведение.Однако оба, похоже, оказались в одной очереди.Как выполняются обещания в первую очередь, если они используют ту же очередь, что и любой другой обратный вызов?

Логично предположить, что обещания помещаются в другую очередь с более высоким приоритетом, чем обратные вызовы в очереди событий, но я не могунайдите любые источники, подтверждающие это.

Я понимаю, что все браузеры по-разному обрабатывают очередь событий и что в разных средах наблюдается различное поведение.Однако я должен что-то упустить.

1 Ответ

0 голосов
/ 27 декабря 2018

Это определенная реализация.Спецификация 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.

...