freeCodeCamp/guide/russian/javascript/await-promises/index.md

121 lines
4.9 KiB
Markdown
Raw Normal View History

2018-10-12 20:00:59 +00:00
---
title: Await Promises
localeTitle: Ожидание обещаний
---
## Ожидание обещаний
В `async` / `await` [операторы](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators) облегчают реализацию многого асинхронного Promises. Они также позволяют инженерам писать более четкий, более сжатый, проверяемый код.
Чтобы понять эту тему, вы должны иметь четкое представление о том, как работают [Обещания](https://guide.freecodecamp.org/javascript/promises) .
---
2018-10-12 20:00:59 +00:00
## Основной синтаксис
``` javascript
function slowlyResolvedPromiseFunc(string) {
return new Promise(resolve => {
setTimeout(() => {
resolve(string);
}, 5000);
});
}
async function doIt() {
const myPromise = await slowlyResolvedPromiseFunc("foo");
console.log(myPromise); // "foo"
}
2018-10-12 20:00:59 +00:00
doIt();
2018-10-12 20:00:59 +00:00
```
Следует отметить несколько моментов:
* Функция, которая заключаетв себе объявление `await` должна содержать оператор `async`. Это подскажит Инттерпретатору JS, что нужно дождаться разрешение и отвержения resolve.
* Оператор `await` должен быть подключен во время объявления const.
* Это работает как для `reject`, так и для `resolve`
2018-10-12 20:00:59 +00:00
There are a few things to note:
---
## Вложенные Promises vs. `Async` / `Await`
2018-10-12 20:00:59 +00:00
Реализация одного Promise довольно просто. В отличии от Цепочки Promises или создания набора зависимостей, что может привести с созданию "spagetti code" ("спагетти из кода").
2018-10-12 20:00:59 +00:00
В следующих примерах подразумевается, что библитека <a href='https://github.com/request/request-promise' target='_blank' rel='nofollow'>`request-promise`</a> доступна по `rp`.
2018-10-12 20:00:59 +00:00
### Цепочки / Вложенные Promises
2018-10-12 20:00:59 +00:00
``` javascript
// Первый Promise
const fooPromise = rp("http://domain.com/foo");
2018-10-12 20:00:59 +00:00
fooPromise.then(resultFoo => {
// Ожидайте разрешения "foo"
console.log(resultFoo);
const barPromise = rp("http://domain.com/bar");
const bazPromise = rp("http://domain.com/baz");
return Promise.all([barPromise, bazPromise]);
}).then(resultArr => {
// Обрабатываем разрешения «bar» и «baz» здесь
console.log(resultArr[0]);
console.log(resultArr[1]);
});
2018-10-12 20:00:59 +00:00
```
### `async` и `await` Promises
``` javascript
// Оберните все в асинхронную функцию
async function doItAll() {
// Получите данные из конечной точки "foo", но дождаться разрешения
console.log(await rp("http://domain.com/foo"));
// Параллельно запустите следующие две асинхронные функции,
// не ждите пока "bar" запустит "baz"
const barPromise = rp("http://domain.com/bar");
const bazPromise = rp("http://domain.com/baz");
// Когда обе запуститлись параллельно, ждите обе
const barResponse = await barPromise;
const bazResponse = await bazPromise;
console.log(barResponse);
console.log(bazResponse);
2018-10-12 20:00:59 +00:00
}
// Наконец, вызовите асинхронную функцию
doItAll().then(() => console.log('Done!'));
2018-10-12 20:00:59 +00:00
```
Преимущества использования `async` и `await` должны быть ясны. Этот код более читабельный, модульный и поддающийся тестированию.
2018-10-12 20:00:59 +00:00
Справедливо заметить, что не смотря на большую степень параллелилизма, лежащий в основе вычислительный процесс идентичен тому из предыдущего примераю
2018-10-12 20:00:59 +00:00
---
2018-10-12 20:00:59 +00:00
## Разрешение Ошибок / Rejection
2018-10-12 20:00:59 +00:00
Обыкновенный блок попытка-перехват разрешит отвергнутый Promise.
``` javascript
async function errorExample() {
try {
const rejectedPromise = await Promise.reject("Oh-oh!");
} catch (error) {
console.log(error); // "Uh-oh!"
}
}
2018-10-12 20:00:59 +00:00
errorExample();
```
2018-10-12 20:00:59 +00:00
---
2018-10-12 20:00:59 +00:00
#### Дополнительная информация:
* `await` Операторы [MDN Docs](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/await)
* `async` Оператор функций [MDN Docs](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/async_function)