Просто блог, і нічого більше

Асинхронні операції в JavaScript

Усім, хто знайомий із мовою програмування JavaScript, знайомі її основні можливості. Хтось знає більше, дехто щось чув про одно/багатопоточність, коллбеки, їх розвиток та якісь там async/await… Та, як на мене, більшість достеменно не розуміє, як працює JS зсередини, ті чому багато операцій відбувається “по-особливому”. Сьогодні хочу поговорити про асинхронні операції та асинхронність загалом в JS.

V8 без асинхронностей

Якщо витягнути з репозиторія движок V8, який є основою роботи JavaScript в Chrome та інших браузерах, ми не знайдемо там згадки про такі штуки як setTimeout, XMLHttpRequest тощо. А вони, начебто – основа вбудованих асинхронних операцій в мові.

Насправді, усе це щастя – надбання браузерного WebAPI, що приносить нам такі структури як event-loop та callback-queue. Ви коли-небудь задумувались, що таке V8 від Google зсередини? Якщо ні, постараюсь коротко та в загальному розказати про це.

Call-stack та Memory heap

V8 складається із таких основних компонентів, як Memory heap – те місце, де відбувається процес виділення пам’яті для проведення певних операцій, та call stack – потік, в який потрапляють різні події(стекові кадри).

Потоки виконання

JavaScript – однопотокове середовище, а отже, виконувати декілька завдань одночасно він не зможе. В існуванні стеку можна переконатись таким чином:

стек викликів

У наведеному вище прикладі функція повертала себе ж саму, що переповнило stack size. Та розумний браузер не дочекався свого кінцевого тупняка, і зупинив це марнотратне виконання, сповістивши нас екземпляром RangeError. Отже, постає питання, як в однопотоковому середовищі працює ряд таких операцій, як setTimeout(), Promise, Callback’и?..

Як добиваються асинхронності, Web-API

Для виконання усіх дефолтних асинхронних операцій в роботу вступають інструменти не JavaScript’а, а браузерне API, що дає змогу звільнити stack-викликів, зосередивши “відкладені” операції в черзі (task-queue), яка, при звільненні основного потоку, “доповнить” його операціями.

Висновки

JavaScript – потужна, хоча і доволі дивна по відношенні до інших, мова програмування та середовище загалом. На даний момент більшість клієнтських/серверних завдань можна виконати із використанням JS.