async / Ждите Операторы Убедитесь проще реализовать многие асинхронные обещания. Они также позволяют инженерам написать более четкий, более краткий, тестичный код.
Чтобы понять эту тему, вы должны иметь твердое понимание того, как Обещания Работа.
Основной синтаксис
function slowlyResolvedPromiseFunc(string) {
return new Promise(resolve => {
setTimeout(() => {
resolve(string);
}, 5000);
});
}
async function doIt() {
const myPromise = await slowlyResolvedPromiseFunc("foo");
console.log(myPromise); // "foo"
}
doIt();Есть несколько вещей, которые следует отметить:
- Функция, которая включает в себя
ждатьДекларация должна включатьasyncоператор. Это скажет переводчика JS, что он должен подождать, пока обещание не будет разрешено и не отклонено. -
ждатьОператор должен быть встроенным, во время декларации Const. - Это работает на
Отклонитьа такжерешитьОтказ
Вложенные обещания против Async/ждут
Реализация единственного обещания довольно просто. Напротив, привязанные обещания или создание шаблона зависимости могут производить «код спагетти».
Следующие примеры предполагают, что Запрос-обещание Библиотека доступна как RP Отказ
Отрагинские/вложенные обещания
// First Promise
const fooPromise = rp("http://domain.com/foo");
fooPromise.then(resultFoo => {
// Must wait for "foo" to resolve
console.log(resultFoo);
const barPromise = rp("http://domain.com/bar");
const bazPromise = rp("http://domain.com/baz");
return Promise.all([barPromise, bazPromise]);
}).then(resultArr => {
// Handle "bar" and "baz" resolutions here
console.log(resultArr[0]);
console.log(resultArr[1]);
});async и ждать обещаний
// Wrap everything in an async function
async function doItAll() {
// Grab data from "foo" endpoint, but wait for resolution
console.log(await rp("http://domain.com/foo"));
// Concurrently kick off the next two async calls,
// don't wait for "bar" to kick off "baz"
const barPromise = rp("http://domain.com/bar");
const bazPromise = rp("http://domain.com/baz");
// After both are concurrently kicked off, wait for both
const barResponse = await barPromise;
const bazResponse = await bazPromise;
console.log(barResponse);
console.log(bazResponse);
}
// Finally, invoke the async function
doItAll().then(() => console.log('Done!'));Преимущества использования async и ждать должно быть ясно. Этот код более читаемый, модульный и тестичный.
Это справедливо отметить, что, хотя также есть дополнительное чувство параллелизма, основной вычислительный процесс такой же, как предыдущий пример.
Обработка ошибок/отклонения
Базовый блок Try-Catch, обрабатывает отклоненное обещание.
async function errorExample() {
try {
const rejectedPromise = await Promise.reject("Oh-oh!");
} catch (error) {
console.log(error); // "Uh-oh!"
}
}
errorExample();Оригинал: “https://www.freecodecamp.org/news/async-await-and-promises/”