Я уже использую функции ECMAScript 6 и ECMAScript 7 (благодаря Babel) в своих приложениях - как мобильных, так и веб-.
Первым шагом, очевидно, был уровень ECMAScript 6. Я изучил множество асинхронных шаблонов, обещаний (которые действительно многообещающие), генераторов (не знаю, почему используется символ *) и т. Д. Из них обещания очень хорошо подходят для моей цели. И я довольно часто использую их в своих приложениях.
Вот пример / псевдокод того, как я реализовал базовое обещание -
var myPromise = new Promise(
function (resolve,reject) {
var x = MyDataStore(myObj);
resolve(x);
});
myPromise.then(
function (x) {
init(x);
});
Шло время, я наткнулся на ECMAScript 7 признаков, и один из них ASYNC
и AWAIT
ключевых слов / функции. Все это вместе творит великие чудеса. Я начал заменять некоторые из своих обещаний на async & await
. Кажется, они добавляют большую ценность стилю программирования.
Опять же, вот псевдокод того, как выглядит моя функция async, await:
async function myAsyncFunction (myObj) {
var x = new MyDataStore(myObj);
return await x.init();
}
var returnVal = await myAsyncFunction(obj);
Не говоря уже о синтаксических ошибках (если таковые имеются), они оба делают то же самое, что я чувствую. Мне почти удалось заменить большинство своих обещаний на async, awaits.
Почему требуется async, await, когда обещания выполняют аналогичную работу?
Решает ли async, await более серьезную проблему? Или это было просто другое решение проблемы обратного вызова?
Как я сказал ранее, я могу использовать обещания и async, ждать решения той же проблемы. Есть ли что-то конкретное, что async await решено?
Дополнительные примечания:
Я широко использую async, awaits и promises в своих проектах React и модулях Node.js. React особенно был ранней пташкой и принял множество функций ECMAScript 6 и ECMAScript 7.
источник
Ответы:
async/await
просто дает вам ощущение синхронности в асинхронном коде. Это очень элегантная форма синтаксического сахара.Для простых запросов и манипулирования данными обещания могут быть простыми, но если вы столкнетесь со сценариями, в которых есть сложные манипуляции с данными и многое другое, легче понять, что происходит, если код просто выглядит так, как будто он синхронный (иными словами, синтаксис сам по себе является формой «случайной сложности», которую
async/await
можно обойти).Если вам интересно знать, вы можете использовать такую библиотеку
co
(наряду с генераторами), чтобы создать такое же ощущение. Подобные вещи были разработаны для решения проблемы, которая вasync/await
конечном итоге решает (изначально).источник
Async / Await обеспечивает гораздо более удобный синтаксис в более сложных сценариях. В частности, все, что связано с циклами или некоторыми другими конструкциями, такими как
try
/catch
.Например:
while (!value) { const intermediate = await operation1(); value = await operation2(intermediate); }
Этот пример был бы значительно более запутанным, просто используя промисы.
источник
const getValue = value => value || operation1().then(operation2).then(getValue);
Прежде всего вы должны понять, что
async
/await
syntax - это просто синтаксический сахар, предназначенный для увеличения обещаний. Фактически возвращаемое значениеasync
функции - это обещание. Синтаксисasync
/await
дает нам возможность писать асинхронно в синхронном режиме. Вот пример:Цепочка обещаний:
function logFetch(url) { return fetch(url) .then(response => response.text()) .then(text => { console.log(text); }).catch(err => { console.error('fetch failed', err); }); }
Async
функция:async function logFetch(url) { try { const response = await fetch(url); console.log(await response.text()); } catch (err) { console.log('fetch failed', err); } }
В приведенном выше примере
await
ожидаетfetch(url)
разрешения или отклонения обещания ( ). Если обещание разрешено, значение сохраняется вresponse
переменной, и если обещание отклоняется, оно выдаст ошибку и, таким образом, войдет вcatch
блок.Мы уже видим, что использование
async
/await
может быть более читабельным, чем цепочка обещаний. Это особенно верно, когда количество обещаний, которые мы используем, увеличивается. И цепочка обещаний, иasync
/await
решают проблему ада обратного вызова, и какой метод вы выберете, зависит от личных предпочтений.источник
Полное сравнение с плюсами и минусами.
Обычный JavaScript
Async (библиотека)
Обещания
Генераторы
Асинхронное ожидание
источник
Async / await может помочь сделать ваш код более чистым и читаемым в тех случаях, когда вам нужен сложный поток управления. Он также создает более удобный для отладки код. И позволяет обрабатывать как синхронные, так и асинхронные ошибки с помощью только
try/catch
.Недавно я написал этот пост, демонстрирующий преимущества async / await над обещаниями в некоторых распространенных случаях использования с примерами кода: 6 причин, почему JavaScript Async / Await удаляет обещания (Учебник)
источник