Автор оригинала: FreeCodeCamp Community Member.
Уильям Готтсчалком
На протяжении многих лет «Callback Hell» часто цитируется как один из самых ненавистных шаблонов дизайна в JavaScript для управления параллелизмом. На всякий случай, если вы забыли то, что похоже, вот пример разной и обработки транзакции в Express:
Обещания должны были спасти нас …
Мне сказали, что обещания позволят нам разработчики JavaScript пишут асинхронному коду, как если бы он был синхронно путем упаковки наших асинхронных функций в специальном объекте. Чтобы получить доступ к ценности обещания, мы называем либо .then или .ловить на объекте обещания. Но Что происходит, когда мы пытаемся ревертировать вышеприведенный пример, используя обещания?
Поскольку каждая функция внутри обратного вызова нацелена, мы не можем получить доступ к объекту пользователя внутри второго .then Перезвоните.
Так что после небольшого копания я не мог найти элегантное решение, но я нашел расстраивающий:
Отступ мои обещания!? Так Возвращение к пирамиды гибели сейчас?
Я бы утверждал, что вложенная версия обратного вызова выглядит уборщиком и легче рассуждать о том, чем вложенная версия для обещания.
Async a ждать спасет нас!
async и ждать Ключевые слова позволят нам написать наш код JavaScript, как будто он синхронно. Вот код, написанный с этими ключевыми словами, приходящимися в ES7:
К сожалению большинство функций ES7, включая async / Ждите не были реализованы и поэтому требуют использования транспортера. Тем не менее, вы можете написать код, который выглядит точно так же, как выше, использующий функции ES6, которые были реализованы в большинстве современных браузеров, а также в узле версии 4+.
Динамический дуэт: Генераторы и Coroutines
Генераторы – отличный метаппрограммирующий инструмент. Они могут быть использованы для таких вещей, как ленивая оценка, итерация на наборы данных с памятью, и обработка данных по требованию из нескольких источников данных, используя библиотеку, такую как RXJS.
Тем не менее, мы не хотели бы использовать генераторы в одиночку в производственном кодексе, потому что они заставляют нас рассуждать о процессе со временем. И каждый раз, когда мы звоним дальше, мы вернемся к нашему генератору, как утверждение GOTO.
Корутины понимают это и устраняют эту ситуацию, упаковывая генератор и рассуждая всю сложность.
Версия ES6 с использованием COROUTINE
Coroutines позволяют нам доходность Наши асинхронные функции одна строка за раз, делая наш код синхронно.
Важно отметить, что я использую библиотеку CO. COS COROUTINE будет немедленно выполнять генератор, где Buredbird’s Coroutine вернет функцию, которую вы должны вызывать, чтобы запустить генератор.
Давайте установим некоторые основные правила использования Coroutines:
- Любая функция справа от доходность должен вернуть обещание.
- Если вы хотите выполнить свой код сейчас, используйте CO Отказ
- Если вы хотите выполнить свой код позже, используйте co.wrap Отказ
- Убедитесь, что цепь .catch В конце вашего COROTINE для обработки ошибок. В противном случае вы должны обернуть свой код в блоке попробовать/Catch.
- Bluebird’s Обещание .Корунтина эквивалентно CO co.wrap. И не CO функция на свою собственную.
Что, если я хочу работать несколько процессов одновременно?
Вы можете либо использовать объекты или массивы с ключевым словом доходности, а затем разрушать результат.
Библиотеки, которые вы можете использовать сегодня:
Обещание .Корунтина |. синяя птица Bluebird – это полнофункциональный JavaScript обещает библиотека с непревзойденной производительностью. bluebirdjs.com CO Генератор Async Control Flow Goodless www.npmjs.com Бабел · Компилятор для записи JavaScript следующего поколения Компилятор для написания следующего поколения JavascriptBabeljs.io Asyncawait async/a ждать для node.js www.npmjs.com.
Оригинал: “https://www.freecodecamp.org/news/write-modern-asynchronous-javascript-using-promises-generators-and-coroutines-5fa9fe62cf74/”