Не секрет (и не удивительно), что _1 _ / _ 2_ - одна из самых ожидаемых функций ES8 / ES2017. Хотя уже есть много замечательных ресурсов о магии ключевого слова await
, его невоспетый помощник async
не получил такого же внимания.
Если вы использовали _5 _ / _ 6_ раньше, то знаете, что async
- это то, что позволяет await
работать и требуется в объявлении функции ближайшего родителя при любом использовании ключевого слова await
. Без async
await
просто заблокировал бы выполнение кода. Это отрицало бы асинхронный характер JS, одну из лучших функций JS и причину, по которой JS можно использовать на стороне сервера (например, в Node). Для этого async
делает функцию, ну, в общем, асинхронной, заставляя функцию возвращать обещание, позволяя другому коду продолжать работу, пока он await
s.
Побочным эффектом этого является то, что async
делает написание асинхронных функций на основе обещаний простым и синхронным:
- Обещание, возвращаемое функцией
async
, разрешается с использованием.then()
- как и любое другое обещание - когда функция возвращается с возвращенным значением - точно так же, как синхронная функция. - Обещание, возвращаемое функцией
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
)