Я думаю об этом, и вот что я придумал:
Скажем, у нас есть такой код:
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. И он продолжает работать над другими и т.д.
Результаты этого выполнения следующие:
a c d b
Итак, сначала второй setTimeout был закончен, и его функция обратного вызова запускается раньше первого, и это имеет смысл.
Здесь мы говорим о однопоточном приложении. JS Engine продолжает выполнение этого, и если он не завершит первый запрос, он не перейдет ко второму. Но хорошо, что он не будет ждать, пока блокирующие операции, такие как setTimeout, будут устранены, поэтому он будет быстрее, потому что он принимает новые входящие запросы.
Но мои вопросы возникают по следующим пунктам:
# 1: Если речь идет о однопоточном приложении, то какой механизм обрабатывает setTimeouts, в то время как механизм JS принимает больше запросов и выполняет их? Как один поток продолжает работать с другими запросами? Что работает на setTimeout, в то время как другие запросы продолжают поступать и выполняться.
# 2: Если эти функции setTimeout выполняются за кулисами, в то время как больше запросов поступает и выполняется, что выполняет асинхронные исполнения за кулисами? Что это за вещь, о которой мы говорим, называется EventLoop?
# 3: Но не следует ли весь метод помещать в EventLoop, чтобы все это выполнялось и вызывался метод обратного вызова? Это то, что я понимаю, когда речь идет о функциях обратного вызова:
function downloadFile(filePath, callback)
{
blah.downloadFile(filePath);
callback();
}
Но в этом случае, как JS Engine знает, является ли он функцией async, чтобы он мог поместить обратный вызов в ключевое слово EventLoop? Perhaps something like the async` в С# или какой-то атрибут, который указывает на метод JS Engine, взять метод асинхронный, и его следует обрабатывать соответствующим образом.
# 4: Но статья противоречит тому, что я догадывался о том, как можно работать:
Loop Event представляет собой очередь функций обратного вызова. Когда асинхронно функция выполняет функцию обратного вызова в очередь. Механизм JavaScript не запускает обработку цикла событий до тех пор, пока кода после выполнения функции async.
# 5: И здесь есть этот образ, который может оказаться полезным, но первое объяснение на изображении говорит точно то же самое, что упоминается в вопросе №4:

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