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

асинхронный / ожидание

async/await — более понятный синтаксис для работы с промисами: код ** читается как синхронный код**, но за кулисами он использует точно такие же промисы, что и в предыдущем уроке.

async function

Функция, объявленная с помощью async всегда возвращает обещание.

JS
async function forty() {
  return 40;
}

forty(); // Promise { 40 }
forty().then((v) => console.log(v)); // 40

Даже если вы возвращаете «нормальное» значение, функция оборачивает его в разрешенный промис.

await

Внутри async function вы можете поставить await перед обещанием: выполнение приостановлено до тех пор, пока обещание не будет выполнено, затем продолжается с разрешенным значением.

JS
async function sum() {
  const a = await Promise.resolve(10);
  const b = await Promise.resolve(20);
  return a + b; // 30
}

Эквивалент в стиле .then (более подробный):

JS
function sum() {
  return Promise.resolve(10).then((a) => Promise.resolve(20).then((b) => a + b));
}

await распространяет ошибки

Если обещание отклонено, await повторно выдает ошибку. Вы можете поймать его обычным try/catch:

JS
async function read() {
  try {
    const x = await Promise.reject(new Error('no'));
    return x;
  } catch (err) {
    return 'error: ' + err.message;
  }
}

read(); // Promise { 'error: no' }

Стрелка асинхронная

JS
const double = async (n) => n * 2;
double(5); // Promise { 10 }

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

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

Определите `асинхронную функцию addOne(p)`, которая получает обещание числа и возвращает (как обещание) число + 1. Используйте await.

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

константа п = ожидание р; вернуть n + 1;

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

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

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

Определите `sumTwo(pa, pb)` асинхронно: получает два промиса чисел, возвращает их сумму. Используйте два последовательных ожидания.

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

дождитесь каждого, затем верните a + b.

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