Асинхронный JavaScript
Функция, которая передается как аргумент в другую функцию, называется callback-функцией, а функция которая ее принимает называется функцией высшего порядка.
Промис - это объект, который содержит будущее значение асинхронной операции.
- Промис имеет 3 состояния:
- Pending (ожидание) - промис ожидает завершение асинхронной операции
- Resolved / Fullfild - промис решен, асинхронная операция завершила свое выполнение
- Rejected (отклоненный) - промис отклонен, произошла ошибка в процессе выполнения
Синтаксис:
123const promise = new Promise((res, rej) => {//...})
Promise.all() - этот метод принимает массив промисов и возвращает массив их результатов.
Promise.race() - этот метод принимает массив промисов и возвращает один новый промис, который будет выполненным или отклоненным, если отклоненный промис встретится раньше.
- status: "fulfilled", если выполнен успешно или "rejected", если ошибка
- value – результат, если успешно или reason – ошибка, если нет
Promise.allSettled() - ждёт, пока все промисы завершатся и возвращает их результаты в виде массива с объектами, у каждого объекта два свойства:
Promise.any() - ожидает первый успешно выполненный промис, который становится его результатом, остальные игнорируются. Если все переданные промисы отклонены, AggregateError становится ошибкой Promise.any.
Promise.resolve() - возвращает успешно выполнившийся промис с результатом value.
Promise.reject() - возвращает промис с ошибкой error.
- Ключевое слово async перед объявлением функции:
- Обязывает ее всегда возвращать промис
- Позволяет использовать await в теле
- Ключевое слово await перед промисом заставит JavaScript дождаться выполнения, после чего:
- Если промис завершается с ошибкой, будет сгенерировано исключение, как если бы на этом месте находилось throw
- Иначе вернется результат промиса
CallbackHell - это когда в колбеках большая вложенность из-за чего трудно понимать код.
- CallbackHell решается:
- Комментированием кода
- Разделением больших функций на несколько маленьких
- Использованием асинхронных функций
Промиссификация - позволяет избежать использования callback-функций, что делает код более читаемым и поддерживаемым.
Event loop - это бесконечный цикл, который ожидает задачи, выполняет их, а затем ожидает поступление новых задач.
Есть call stack, который по очереди обрабатывает синхронные события.
Клики, таймауты регистрируются в web api и когда происходит событие попадают в task queue (очередь задач), и выполняются, когда call stack очищается.
- Task queue (очередь задач) делится на:
- Микротаски (промисы, queueMicrotask, mutationobserver)
- Макротаски (таймеры, события)
Всегда сначала выполняются все микротаски, затем один макротаск.