Перейти к основному содержимому
Модуль 7 · Урок 1 из 425/32 в курсе~12 min
Уроки модуля (1/4)

Обещания: что это такое

Обещание – это значение, представляющее результат операции, которая завершится в будущем. Он может находиться в одном из трех состояний:

  • pending — операция еще продолжается.
  • выполнено — завершено успешно, есть значение
  • rejected — не удалось, есть ошибка

Как только он выходит из состояния ожидания, он «рассчитывается» навсегда.

Создание решенного промиса

Два самых распространенных способа — вы почти никогда не создадите Promise «вручную» с помощью конструктора:

JS
const p1 = Promise.resolve(42);
const p2 = Promise.reject(new Error('oops'));

Чтение результата: .then / .catch

JS
Promise.resolve(10).then((v) => {
  console.log(v); // 10
});

Promise.reject(new Error('no')).catch((e) => {
  console.log(e.message); // 'no'
});

.then получает функцию, которая вызывается с разрешенным значением. .catch получает функцию, вызываемую с ошибкой в ​​случае отклонения.

Цепочка

Каждый .then, в свою очередь, возвращает Promise: вы можете объединить их, чтобы преобразовать значение шаг за шагом.

JS
Promise.resolve(5)
  .then((n) => n * 2)
  .then((n) => n + 1)
  .then((n) => console.log(n)); // 11

Если какой-либо из .then выдает (или возвращает невыполненное обещание), выполнение переходит к первому последующему .catch.

Конструктор (редкий)

JS
const p = new Promise((resolve, reject) => {
  if (Math.random() > 0.5) resolve('ok');
  else reject(new Error('no'));
});

Вы будете использовать его только тогда, когда вам нужно «пообещать» что-то, использующее обратные вызовы (например, старые API-интерфейсы DOM или setTimeout).

Попробуйте это

Упражнение#js.m7.l1.e1
Попыток: 0Загрузка…

Определите `promizedVersion(n)`, который по заданному числу возвращает обещание, разрешенное с двойным значением n.

Загрузка редактора…
Показать подсказку

вернуть Promise.resolve(n * 2)

Решение доступно после 3 попыток

Обзор упражнения

Упражнение#js.m7.l1.e2
Попыток: 0Загрузка…

Определите `incrementThree(p)`, который получает обещание числа и возвращает обещание числа + 3. Используйте цепочку .then.

Загрузка редактора…
Показать подсказку

p.then((n) => n + 3)

Решение доступно после 3 попыток