Я думаю про це, і ось що я придумав:
Давайте подивимось цей код нижче:
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:
Тож моє запитання тут полягає в тому, щоб отримати деякі роз’яснення щодо перелічених вище предметів?