# 01. Async Functions

Асинхронные функции появились в результате комбинации возможностей Promise и генераторов. Кто-то заметил, что можно использовать генераторы для того, что бы приостановить выполнение программы до тех пор, пока Promise не будет установлен, а потом вернуть значение Promise в место его вызова и продолжить:

```javascript
const result = yield promise;
```

Так можно выполнять асинхронную функцию, последовательно переходя от Promise к Promise, при этом выполнение каждого Promise происходит асинхронно:

```javascript
function* asyncFunction() {
  const result = yield asyncOperation1();
  const outcome = yield asyncOperation2(result);
  return outcome;
}
```

Основное преимущество асинхронных функций в том, что они позволяют описывать асинхронные операции так, что они выглядят как синхронные. Формирование цепочки Promise заменяется на последовательность вызовов асинхронных функций и исполнение кода выглядит так, как будто он выполняется синхронно.

Преимущества асинхронных функций:

* Concise and clean code (более простая ментальная модель).
* Error handling (обработка ошибки может происходить там же, где и вызов асинхронной функции).
* Conditionals
* Легче обрабатывать промежуточные значения (их можно передать в цепочке асинхронных вызовов).
* Error stacks
* Debugging
* С Async/await можно использовать циклы, т.е. подходит для serial-операций.
