?. — 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 и выполняется.