Оригинальный адрес:JavaScript: Promises and Why Async/Await Wins the Battle
Асинхронные функции имеют хорошие и плохие стороны в JavaScript. Положительным моментом является то, что асинхронные функции не блокируют и поэтому работают быстро, особенно в контексте Node.js. Недостатком является то, что работа с асинхронными функциями может быть громоздкой, потому что иногда нужно дождаться завершения функции, чтобы получить «обратный вызов», прежде чем перейти к следующему выполнению.
Есть способы воспользоваться преимуществами асинхронных вызовов функций и правильно обработать их выполнение, но один намного лучше другого (Спойлер: это Async/Await). В этой статье вы узнаете, как использоватьPromisesа такжеAsync/AwaitВсе входы и выходы, и наши мысли о том, как они сравниваются.
Promises vs. Callbacks
Как разработчик JavaScript или Node.js, правильно поймитеPromises
а такжеCallbacks
Разница между ними и тем, как они работают вместе, имеет решающее значение.
Между ними есть небольшие, но важные различия. в каждомPromise
Ядро, естьCallback
для разрешения некоторых данных (или ошибок), которые вызываютсяPromise
.
Обработчик обратного вызова:
Вызовите функцию validatePassword():В следующем фрагменте кода показана полная сквозная проверка проверенного пароля (он статичен и должен совпадать с «bambi»):Код очень хорошо прокомментирован, но если вы запутаетесь,catch
Только вreject()
отpromise
Выполняется при вызове. Поскольку пароли не совпадают, вызываемreject()
,следовательно“catch”
ошибку и отправить наdone()
функция.
Promises
По сравнению с традиционными методами, основанными на обратном вызове,Promise
Предоставляет более простую альтернативу для выполнения, создания и управления асинхронными операциями. Они также позволяют вам использовать синхронизацию, напримерtry / catch
метод обработки асинхронных ошибок.
Промисы также предоставляют три уникальных состояния:
-
Pending
-promise
результат не был определен, так как асинхронная операция, которая даст его результат, не завершена. -
Fulfilled
- асинхронная операция завершена, иpromise
иметь ценность. -
Rejected
- асинхронная операция не удалась,promise
никогда не материализуется. В отвергнутом состоянии,promise
есть одинreason
Может указать, почему операция не удалась.
когдаpromise
существуетpending
состоянии, его можно преобразовать вfulfilled
илиrejected
положение дел. Однако однаждыpromise
получатьfulfilled
илиrejected
, он никогда не перейдет в какое-либо другое состояние, егоvalue
или причина отказа не изменится.
Недостаток 👎
Promise
Чего он не делает, так это не решает того, что называется «адом обратных вызовов» (Оригинал: обещания не решают того, что называется «адом обратных вызовов», который на самом деле представляет собой просто серию вложенных вызовов функций. Ад» на самом деле просто серия вложенных вызовов функций. Конечно, для одного звонка это не имеет значения. Но с несколькими вызовами ваш код будет трудно читать и поддерживать.
Зацикливание на обещаниях 🎡
Чтобы избежать глубоко вложенных обратных вызовов с помощью JavaScript, предположим, что можно просто пройтиPromises
, возвращает результат объекту или массиву и останавливается по завершении. К сожалению, это непросто; из-за асинхронной природы JavaScript, если вы перебираете каждуюPromise
, который не вызывается после завершения кода“done”
мероприятие.
Правильный способ справиться с этой ситуацией - использоватьPromise.all()
. Эта функция ожидает всехFulfillments
(Или в первый разrejection
).
Обработка ошибок 💣
Используйте несколько вложенныхPromise
Призывать к обработке ошибок — все равно, что водить машину с завязанными глазами. удачи в выяснении какойPromise
сделал ошибку. Лучше всего удалить его полностьюcatch()
метод и подписаться на глобальный обработчик ошибок следующим образом:
браузер:
Node.js: Уведомление: Вышеуказанные два варианта — это два способа гарантировать обнаружение ошибок. Если пропустили добавьтеcatch()
метод, он будет проглочен кодом.
Асинхронно/Подождать?🤔
Async/Await
Позволяет нам писать асинхронный JavaScript, который выглядит синхронно. Из первых нескольких частей этой статьи вы узналиPromises
- Это должно упростить асинхронный поток и избежать ада обратных вызовов, но это не так.
Ад обратного звонка? 🔥
Callback-hell
это термин, используемый для описания следующих сценариев:
Примечание. Например, это вызов API для получения 4 конкретных пользователей из массива.
Такой код уродлив и занимает много места.Async/Await
— это новейшая и лучшая вещь в JavaScript, которая позволяет нам не только избежать ада обратных вызовов, но и гарантировать, что наш код чист, а ошибки правильно обнаружены. я нашелAsync/Await
Самое интересное, что он встроенPromises
выше (неблокирующие и т. д.), и разрешить чтение кода, как если бы он был синхронным. В этом-то и дело.
Код элегантнее писать таким образом, верно? 💃Примечание. Вот пример набора вызовов API для извлечения 4 пользователей из массива, более половины строк кода:
потому чтоAsync/Await
построен на промисах, так что вы можете дажеawait
использоватьPromise.all()
:
Async/await
Чуть медленнее. Следует соблюдать осторожность при использовании его несколько раз подряд, потому чтоawait
Ключевое слово останавливает выполнение всего последующего кода, как и в синхронном коде.
Как начать работу с Async/Await? 💻
использоватьAsync/Await
Очень легко понять и использовать. Фактически, он изначально доступен в последних версиях Node.js и быстро внедряется в браузеры. Теперь, если вы хотите использовать его на стороне клиента, вам нужно использовать Babel.
Асинхронный Асинхронный
Давайте начнем сasync
ключевое слово начинается. его можно поместить вfunction
До этого следующим образом:
Подожди Подожди
ключевые словаawait
заставить JavaScript ждатьpromise
Идите вперед и верните его результат. Следующим образом:
Почему Async/Await лучше? 😁
Теперь мы понялиPromises
а такжеAsync/Await
Многое из того, что предлагается, давайте рассмотрим, почемуStreamдуматьAsync/Await
является лучшим выбором для кодовых баз.
-
Async/Await
Позволяет использовать меньше строк кода, менее печатать и меньше ошибок, обеспечивая чистую и краткую кодовую базу. В конечном итоге, он делает сложный вложенный код, который снова читаемый. - использовать
try/catch
Обработка ошибок (в одном месте, не при каждом вызове) - Стек ошибок имеет смысл, а не от
Promises
Получены неясные ошибки, они большие, и их трудно найти, где произошла ошибка. Самое главное, ошибка указывает на функцию, в которой произошла ошибка.
Заключительные мысли 📃
Можно сказатьAsync/Await
— одна из самых мощных функций, добавленных в JavaScript за последние несколько лет.
Потребовалось меньше дня, чтобы понять синтаксис и увидеть, насколько плоха наша кодовая база в этом отношении. основывать всех нас наPromise
Код преобразуется вAsync/Await
В общей сложности это заняло около двух дней, и на самом деле это полная переработка — это просто для иллюстрации того, что при использовании Async/Await требуется меньше кода.