Javascript Promises vs Async Await. Разница?
Я уже использовал функции ES6 и ES7 (благодаря Babel) в своих приложениях - как мобильных, так и веб -.
Первый шаг, очевидно, был сделан к уровням ES6. Я узнал много асинхронных паттернов, обещаний (которые действительно многообещающи), генераторов (не уверен, почему символ*) и т. д.,
Из всего этого обещания вполне соответствовали моим целям. И я довольно часто использую их в своих приложениях.
Вот пример / псевдокод того, как я реализовал базовый обещание -
var myPromise = new Promise(
function (resolve,reject) {
var x = MyDataStore(myObj);
resolve(x);
});
myPromise.then(
function (x) {
init(x);
});
Со временем я наткнулся на функции ES7, и одной из них были ключевые слова/функции
ASYNC и AWAIT. Они в совокупности творят великие чудеса. Я начал заменять некоторые из моих обещаний на async & await. Они, по-видимому, придают большое значение стилю программирования.Опять же, вот псевдокод того, как выглядит моя асинхронная функция ожидания-
async function myAsyncFunction (myObj) {
var x = new MyDataStore(myObj);
return await x.init();
}
var returnVal = await myAsyncFunction(obj);
Если оставить в стороне синтаксические ошибки(если таковые имеются), то я чувствую, что они оба делают одно и то же.
Я почти смог это сделать. замените большинство моих обещаний асинхронными, ожидающими.
Мой вопрос вот в чем: зачем нужна асинхронность,ожидание, когда обещания делают подобную работу?
Может ли асинхронность,ожидание решить большую проблему? или это было просто другое решение для обратного вызова ада?
Как я уже говорил ранее, я могу использовать обещания и асинхронность, ожидание, чтобы решить ту же проблему. Есть ли что-то конкретное, что Async Await решил?
Дополнительные Примечания:
Я использую Async, Waits & Promises в моих проектах ReactJS и модулях узлов широко.
ReactJS особенно были ранней птицей и приняли много функций ES6 и ES7.
6 ответов:
Зачем нужна асинхронность, ожидание, когда обещания делают подобную работу? Может ли асинхронность,ожидание решить большую проблему?
async/awaitпросто дает вам Синхронное ощущение асинхронного кода. Это очень изящная форма синтаксического сахара.Для простых запросов и манипуляций с данными обещания могут быть простыми, но если вы столкнетесь со сценариями, в которых есть сложные манипуляции с данными и все такое, вам будет легче понять, что происходит, если код просто выглядит как хотя это синхронно (другими словами, синтаксис сам по себе является формой "случайной сложности", которую
async/awaitможет обойти).Если вам интересно знать, вы можете использовать библиотеку, как
co(наряду с генераторами), чтобы дать такое же ощущение. Подобные вещи были разработаны для решения проблемы, которуюasync/awaitв конечном счете решает (изначально).
Async / Await обеспечивают гораздо более приятный синтаксис в более сложных сценариях. В частности, все, что связано с циклами или некоторыми другими конструкциями, такими как
try/catch.Например:
Этот пример был бы значительно более запутанным, просто используя обещания.while (!value) { const intermediate = await operation1(); value = await operation2(intermediate); }
Полное сравнение с плюсами и минусами.
Обычный JavaScript
- Плюсы
- не требует каких-либо дополнительных библиотек или технологий
- обеспечивает наилучшую производительность
- обеспечивает наилучший уровень совместимости со сторонними библиотеками
- позволяет создавать специальные и более продвинутые алгоритмы
- минусы
- может потребоваться дополнительная код и относительно сложные алгоритмы
Async (библиотека)
- Плюсы
- упрощает наиболее распространенные схемы потока управления
- по-прежнему является решением на основе обратного вызова
- Хорошая производительность
- минусы
- вводит внешнюю зависимость
- все еще может быть недостаточно для продвинутых потоков
Обещания
- Плюсы
- значительно упрощает наиболее распространенные схемы потока управления
- надежная обработка ошибок
- часть спецификации ES2015
- гарантирует отсроченное обращение к исполненным и отвергнутым
- минусы
- требует promisify callback-based API
- вводит небольшой хит производительности
Генераторы
- Плюсы
- делает неблокирующий API похожим на блокирующий
- упрощает обработку ошибок
- часть спецификации ES2015
- минусы
- требуется дополнительная библиотека потоков управления
- по-прежнему требует обратных вызовов или обещаний реализовать не последовательные потоки
- требует thunkify или promisify API на основе nongenerator
Асинхронное ожидание
- Плюсы
- делает неблокирующий API похожим на блокирующий
- чистый и интуитивно понятный синтаксис
- минусы
- требует вавилонских или других транспиляторов и некоторой конфигурации, которая будет использоваться сегодня
Async / await может помочь сделать ваш код чище и более читаемым в тех случаях, когда вам нужен сложный поток управления. Он также производит более удобный для отладки код. И позволяет обрабатывать как синхронные, так и асинхронные ошибки с помощью только
try/catch.Недавно я написал этот пост, демонстрирующий преимущества async / await над promises в некоторых распространенных случаях использования с примерами кода https://hackernoon.com/6-reasons-why-javascripts-async-await-blows-promises-away-tutorial-c7ec10518dd9
Оба способа обработки асинхронного кода. Но есть разница с исполнением каждого. Вот рабочее исполнение -
Обещание
Объект Promise представляет возможное завершение (или отказ) асинхронной операции и ее результирующее значение. Это прокси для значения, не обязательно известного во время его создания, и он представляет собой будущий результат асинхронной операции. Вызывающий код может подождать, пока это обещание не будет выполнено. перед выполнением следующего шага. Для этого у обещания есть метод с именемthen, который принимает функцию, которая будет вызвана, когда обещание будет выполнено.Async / await
Когда вызывается функция
async, она возвращаетPromise. Когда функцияasyncвозвращает значение, функцияPromiseбудет разрешена с помощью возвращаемого значения. Когда функцияasyncвыдает исключение или какое-то значение, обещание будет отклонено вместе с полученным значением.Асинхронная функция может содержит выражение await, которое приостанавливает выполнение асинхронной функции и ожидает разрешения переданного обещания, а затем возобновляет выполнение асинхронной функции и возвращает разрешенное значение
Плюсы async / await над promise
- Async / await построен для того, чтобы дать чистый синтаксис семантика продолжения асинхронных операций.
- он избегает обратного вызова / обещания ада.
Мой вопрос здесь, почему асинхронное ожидание необходимо, когда обещания делают похожая работа? Может ли асинхронность,ожидание решить большую проблему? или это было просто ... другое решение для обратного вызова ада? Как я уже говорил ранее, я способен используйте обещания и асинхронность, ожидайте решения той же проблемы. Есть что-нибудь конкретное, что асинхронные ожидания решены?
Первое, что вы должны понять, что
async/awaitсинтаксис - это просто синтаксический сахар, который предназначен для увеличения обещаний. На самом деле возвращаемое значение функции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Решите проблему обратного вызова ада, и какой метод вы выберете, зависит от личных предпочтений.
Comments