Я думаю про це, і ось що я придумав:
Давайте подивимось цей код нижче:
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:

Тож моє запитання тут полягає в тому, щоб отримати деякі роз’яснення щодо перелічених вище предметів?