Порядок виконання асинхронних функцій у JavaScript

Порядок виконання асинхронних функцій у JavaScript

3 Березня 2024 в 20:27 43

У світі сучасного веб-розробника асинхронність – це ключовий концепт. JavaScript, як мова програмування, пропонує потужні механізми для обробки асинхронних операцій, таких як обробка подій, виклики API та робота зі зворотними викликами. Одним з найбільш потужних інструментів у цій області є асинхронні функції. Однак, розуміння порядку їх виконання може бути важливим для ефективного програмування.

У JavaScript, коли ми працюємо з асинхронними функціями, основними інструментами є обіцянки (

) та ключове слово

. Обіцянки дозволяють нам працювати з асинхронним кодом шляхом реагування на результати виконання обіцянок, тоді як

надає зручний синтаксис для написання асинхронного коду, який виглядає майже як синхронний.

У цій статті ми розглянемо порядок виконання асинхронних функцій у JavaScript на прикладі використання

. В конкретному випадку, ми розглянемо, чому у певних ситуаціях функція з викликом

може виконатися перед виконанням певного коду, що знаходиться після цього виклику, навіть якщо за типовою поведінкою цей код має бути виконаний пізніше.

Давайте подивимося на конкретний код та з’ясуємо, чому це відбувається:

Вихідний результат цього коду виглядає наступним чином:

Що ж тут відбувається по-іншому і чому виклик

відбувається після виклику

, хоча за типовою поведінкою функція з викликом

повинна бути поміщена в мікростек спочатку, перед переходом до виконання коду звичайним стеком?

Причина відмінності полягає в порядку виконання мікрозадач та макрозадач у JavaScript. Коли ми маємо справу з асинхронним кодом, він поділяється на мікрозадачі та макрозадачі. Мікрозадачі, такі як обіцянки, виконуються після поточної макрозадачі, але до наступної. Тобто, коли ми використовуємо

, виклик

стає мікрозадачею, яка буде виконана після поточної макрозадачі.

Тому, після того, як пройшов час в очікуванні обіцянки, контроль повертається до основного стеку виклику, де виконується

. Після виконання цього, мікрозадача

виконується, що призводить до виводу “promise value”.

Таким чином, ми бачимо, що порядок виконання асинхронних функцій у JavaScript залежить від розуміння мікрозадач та макрозадач, що дозволяє нам зрозуміти, чому певні операції відбуваються у певному порядку, навіть якщо вони знаходяться у різних частинах нашого коду.