Я думаю об этом, и вот что я придумал:
Скажем, у нас есть такой код:
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:
Итак, мой вопрос заключается в том, чтобы получить некоторые разъяснения по перечисленным выше элементам?