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