Я думаю об этом, и вот что я придумал:
Посмотрим на этот код ниже:
console.clear();
console.log("a");
setTimeout(function(){console.log("b");},1000);
console.log("c");
setTimeout(function(){console.log("d");},0);
Приходит запрос, и JS-движок начинает шаг за шагом выполнять приведенный выше код. Первые два вызова - это вызовы синхронизации. Но когда дело доходит до setTimeoutметода, он становится асинхронным. Но JS немедленно возвращается из него и продолжает выполнение, которое называется Non-Blockingили Async. И он продолжает работать над другими и т. Д.
Результаты этого исполнения следующие:
AcDb
Таким образом, в основном вторая setTimeoutзавершается первой, и ее функция обратного вызова выполняется раньше, чем первая, и это имеет смысл.
Здесь мы говорим об однопоточном приложении. JS Engine продолжает выполнять это, и если он не завершит первый запрос, он не перейдет ко второму. Но хорошо то, что он не будет ждать, пока блокирующие операции, например, setTimeoutразрешатся, поэтому он будет быстрее, потому что он принимает новые входящие запросы.
Но мои вопросы возникают по следующим пунктам:
№1: Если мы говорим об однопоточном приложении, то какой механизм обрабатывает, в setTimeoutsто время как JS-движок принимает больше запросов и выполняет их? Как отдельный поток продолжает работать над другими запросами? Что работает, в setTimeoutто время как другие запросы продолжают поступать и выполняться.
# 2: Если эти setTimeoutфункции выполняются за кулисами, в то время как поступает и выполняется больше запросов, что за кулисами выполняет асинхронное выполнение? Что это за вещь, о которой мы говорим, называется EventLoop?
# 3: Но не следует ли поместить весь метод в EventLoopтак, чтобы все это выполнялось и вызывается метод обратного вызова? Вот что я понимаю, когда говорю о функциях обратного вызова:
function downloadFile(filePath, callback)
{
blah.downloadFile(filePath);
callback();
}
Но в этом случае, как JS Engine узнает, является ли это асинхронной функцией, чтобы он мог поместить обратный вызов в EventLoop? Возможно, что-то вроде asyncключевого слова в C # или какого-то атрибута, который указывает, что метод, который будет использовать JS Engine, является асинхронным и должен обрабатываться соответствующим образом.
# 4: Но в статье говорится совершенно противоположное тому, что я предполагал о том, как все может работать:
Цикл событий - это очередь функций обратного вызова. Когда выполняется асинхронная функция, функция обратного вызова помещается в очередь. Механизм JavaScript не начинает обработку цикла событий, пока не будет выполнен код после выполнения асинхронной функции.
# 5: И вот это изображение, которое может быть полезно, но первое объяснение на изображении говорит то же самое, что упоминалось в вопросе номер 4:

Итак, мой вопрос заключается в том, чтобы получить некоторые пояснения по перечисленным выше пунктам?