Асинхронный JavaScript

Функция, которая передается как аргумент в другую функцию, называется callback-функцией, а функция которая ее принимает называется функцией высшего порядка.

Промис - это объект, который содержит будущее значение асинхронной операции.

    Промис имеет 3 состояния:
  • Pending (ожидание) - промис ожидает завершение асинхронной операции
  • Resolved / Fullfild - промис решен, асинхронная операция завершила свое выполнение
  • Rejected (отклоненный) - промис отклонен, произошла ошибка в процессе выполнения

Синтаксис:

1
2
3
const promise = new Promise((res, rej) => { //...})

Promise.all() - этот метод принимает массив промисов и возвращает массив их результатов.

Promise.race() - этот метод принимает массив промисов и возвращает один новый промис, который будет выполненным или отклоненным, если отклоненный промис встретится раньше.

    Promise.allSettled() - ждёт, пока все промисы завершатся и возвращает их результаты в виде массива с объектами, у каждого объекта два свойства:

  • status: "fulfilled", если выполнен успешно или "rejected", если ошибка
  • value – результат, если успешно или reason – ошибка, если нет

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)
  • Макротаски (таймеры, события)

Всегда сначала выполняются все микротаски, затем один макротаск.