Чем отличается javascript в браузере от очереди микрозадач и webapi? - PullRequest
0 голосов
/ 03 августа 2020

Я никогда не видел «очередь микрозадач», на которую ссылаются в онлайн-источниках, и мне было интересно, не потому ли, что это очередь webapi, на которую ссылается микрозадача?

Вот видео YouTube, которое было просмотрено 1.5. миллион раз это объясняет событие JS l oop, но «очередь микрозадач» даже не упоминается: https://www.youtube.com/watch?v=8aGhZQkoFbQ

ДОПОЛНЕНИЕ: Это отличный ресурс для изучения о задачах и очередях микрозадач: https://developer.mozilla.org/en-US/docs/Web/API/HTML_DOM_API/Microtask_guide/In_depth Эта ссылка не отвечает на мой вопрос, но касается топи c и дает некоторую полезную ясность.

1 Ответ

1 голос
/ 03 августа 2020

Внутри nodejs «event l oop» есть несколько разных очередей для вещей, ожидающих запуска. Есть очередь для асинхронных операций ввода-вывода, таких как файловые операции. Для таймеров есть отдельный шаг события l oop (на самом деле это не очередь, поскольку таймеры реализованы в событии l oop очень специфическим c способом). Для обещаний есть очередь микрозадач. Поскольку событие l oop ищет следующее действие, оно имеет определенный c порядок, в котором он ищет вещи, и некоторые вещи (например, разрешенные / отклоненные обещания) имеют более высокий приоритет, чем другие вещи, ожидающие выполнения.

c, webapi используется как гигантский заполнитель для всех вещей, которые браузер добавляет в свою среду Javascript, но не встроенных в сам язык Javascript. Это может включать Ajax, DOM и т.д. c ... Действительно, существует несколько очередей, которые являются частью того, что браузер добавляет к ванильной реализации Javascript.

В спецификации ECMAScript используются термины Задания и очереди заданий . Microtask часто используется в отношении обещаний и их реализации, на которые вы можете ссылаться здесь, на MDN , но он используется, чтобы просто попытаться объяснить, как работает спецификация или реализация - этого термина на самом деле нет в спецификация.

В общем, термин микрозадача используется для описания подмножества некоторой более крупной задачи, ожидающей выполнения. Например, если у вас было что-то вроде этого (где $.get() - это вызов ajax:

$.get("http://www.google.com").then(result => {
     console.log("got the page");
}).catch(err => {
     console.log(err);
});

Тогда браузер запустит $.get(), а когда-нибудь позже, когда он завершится, и JS engine бесплатен, будет вызван обратный вызов, который разрешит обещание, которое возвращает $.get(). Разрешение этого обещания позволит обещанию запланировать выполнение его .then() обработчиков. Они планируются, вставляя их в очередь микрозадач обещания. И, когда текущий бит Javascript завершается и возвращается к событию l oop, событие l oop запускает первое, что происходит в этой очереди микрозадач, и оно запускает его до того, как оно выполнит большинство других вещей в других очереди, которые также обслуживаются событием l oop.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...