Перейти к содержанию

?. — optional chaining: аккуратно обращается к свойству/методу, если объект не null/undefined. Иначе возвращает undefined и не бросает ошибку.

?? — nullish coalescing: подставляет значение по умолчанию, только если слева null или undefined (в отличие от ||, которое срабатывает и на 0, false, "").

Promise

Promise — это объект-контейнер будущего результата.

const p = new Promise((resolve, reject) => {
    // executor: выполняется СИНХРОННО сразу при new Promise
    // ...делаем работу, стартуем I/O/таймеры и т.п.
    // потом в какой-то момент:
    // resolve(value);   // успех
    // reject(error);    // ошибка
});

Async/await

async/await — синтаксический сахар над промисами

async превращает функцию в ту, что всегда возвращает Promise. await делает: подождать промис и получить его значение, записав код как будто синхронный.

JS-код в браузере и Node по умолчанию однопоточный: в каждый момент выполняется только один кусок JS. “Асинхронно” = не блокируя этот поток, отдаём долгую работу (сеть, таймеры, файловую систему) рантайму. Когда результат готов, рантайм ставит задачу в очередь, и JS продолжит её, когда освободится.

async у функции даёт право использовать await и гарантирует, что функция вернёт Promise. await приостанавливает только текущую async-функцию, а не весь JS. В это время UI/другие события продолжают работать. Как только промис завершится, продолжение функции ставится в очередь microtask и выполняется.