Не секрет (и не удивительно), что _1 _ / _ 2_ - одна из самых ожидаемых функций ES8 / ES2017. Хотя уже есть много замечательных ресурсов о магии ключевого слова await, его невоспетый помощник async не получил такого же внимания.

Если вы использовали _5 _ / _ 6_ раньше, то знаете, что async - это то, что позволяет await работать и требуется в объявлении функции ближайшего родителя при любом использовании ключевого слова await. Без async await просто заблокировал бы выполнение кода. Это отрицало бы асинхронный характер JS, одну из лучших функций JS и причину, по которой JS можно использовать на стороне сервера (например, в Node). Для этого async делает функцию, ну, в общем, асинхронной, заставляя функцию возвращать обещание, позволяя другому коду продолжать работу, пока он awaits.

Побочным эффектом этого является то, что async делает написание асинхронных функций на основе обещаний простым и синхронным:

  1. Обещание, возвращаемое функцией async, разрешается с использованием .then() - как и любое другое обещание - когда функция возвращается с возвращенным значением - точно так же, как синхронная функция.
  2. Обещание, возвращаемое функцией async, улавливает ошибку с помощью .catch(), когда функция выдает ошибку

Допустим, у нас есть функция, которая возвращает обещание, которое выполняется после получения данных из API. Используя обещания, это может выглядеть следующим образом:

const withPromise = () => {
  return new Promise((resolve, reject) => {
    request(‘https://google.com')
    .then((data) => {
      // Pass data to promise resolution
      resolve(data);
    })
    .catch((err) => {
      // Reject with error
      reject(err);
    });
  });
}

Для этого требуется создать экземпляр нового объекта Promise, а затем вызвать функцию .then, .catch, resolve и reject. Обещания требуют большого багажа, чтобы заставить их работать, не говоря уже о целом наборе уникальной лексики.

Используя async, мы можем добиться того же в нескольких строках

const withAsync = async () => {
  try { return await request(‘https://google.com') }
  catch (err) { throw err }
}

Что не только кратко и читается так же, как синхронный код, но и вернет обещание, как и первый фрагмент.

withPromise().then(data => console.log(data));
withAsync().then(data => console.log(data));

Меня зовут Бретт, я JS-разработчик из Лос-Анджелеса | Beekley.xyz | github.com/beekley

(В приведенных выше фрагментах используется request-promise, модуль для выполнения HTTP-запросов, возвращающих обещания. Это также тривиальные функции, которые просто оборачивают запрос method)