Nitish Phanse.
Я недавно получил шанс снова работать с узлом. Будучи огромным поклонником обещаний, я никогда не пробовал Async ждут. Почему? Потому что обещания работали нормально для меня, поэтому.
Уверенность в том, что обещает работать нормально для простых контроллеров. Пара базы данных запросов и обработка ошибок, потом обещания могут быть неприятными. Да, даже если вы их цепи. Что если бы некоторое разрешенное значение в вашей второй цепочке обещания потребовалось в вашем четвертом обещании? Но опять же, я бы обычно взломал свой путь ( Определите переменную переменную в верхней части функциональной области и переназначить его, а затем использовать его в дальнейшем ).
Использовать определение случая
Я создаю простую спецификацию API, где маршрут Post/пользователи . Почтовый орган имеет некоторые детали пользователя. Если пользователь существует в базе данных, его значения будут обновляться, в базе данных создается новая запись.
Ради простоты я не использую ни одной ORM/базы данных. Я создаю манекетную модель пользователей и использую совокупность для Mock API звонков и запросов БД. Я также использую Math.random () решить, бросить ли ошибку в случае обработки ошибок.
ОК Время для некоторого кода сейчас.
Simple Express Server.
Пользовательская модель
Этот код модели пользователя представляет собой брактечный пользовательский объект, который сделает вызовы MOCK API. Существует два типа вызовов: один с обратными вызовами, а другой с обещаниями. Оба эффективно делают то же самое. Опять же, я устроил много вещей здесь для простоты.
Обратные вызовы
Традиционный способ выполнения любого неблокирующего ввода-вывода был с обратным вызовом, где любой звонок ввода/вывода был из формы
someAsyncOperation(dataObject, function(error, success) { if (error) { // handle error } else { // do something with success }})Это хорошо работает, если вы выполняете одну асинхрочную операцию. Если вы в конечном итоге выполняете несколько async OPS с обратными вызовами, вы получите то, что известно как Обратный вызов пирамиды ада Отказ
Плюсы:
- Удобно для одиночных асинхронизащих операций. Разрешить простые данные и контроль ошибок.
- Должен работать на каждой версии узла и почти все пакеты узла. Поскольку обратные вызовы являются функциями, им не нужны транспортировщики.
Минусы:
- Для нескольких вложенных Async-операций это создает обратный список
- Обработка ошибок должна быть сделана для каждой операции (без обработчика глобального исключения)
Обещания
Обещания – это объекты, которые имеют 3 основных состояния – ожидающие, разрешены и отклонены. В зависимости от ответа асинхронизации асинхронизации обещание либо разрешено, либо отклонено. Многие обещания могут быть привязаны к другой. Один обработчик улов на дне достаточно для ошибки в любом обещании.
Плюсы:
- Допускает легкое цепочка асинхронизации операций. Все, что возвращается в
.thenФункция, может быть прикована в следующую.thenфункция. - Один обработчик улов на дне будет поймать ошибку, если ни один из цепочек обещания бросает исключение.
Минусы:
- Большинство библиотек могут потребовать обаяйную обертку вокруг него, как Bluebird, если они не поддерживают обещания из коробки.
- Область охвата прикованной функции выделяют к тому, что сама функция. Таким образом, некоторые данные, разрешенные во второй цепочке, не могут быть использованы в 4-й цепи, если не объявлена глобальная пусть переменной.
Async/a ждать
Async/ждут в конце дня по-прежнему обещание. Это просто способ написания асинхронного кода в своем роде синхронному способу.
Каждая асинхронная функция должна быть префиксирована с async. . Каждое асинхронное действие в нем должно быть префиксировано словом Ждите . Кроме того, каждая асинхронная функция возвращает обещание, которое может быть разрешено дальше.
Плюсы:
- Чистый код выглядит. Я не могу подчеркнуть на этот момент достаточно. Все разрешенные бит могут быть доступны в блоке TRY.
- Весь блок можно рассматривать как синхронный бит кода. (Хотя это async в природе).
- Добавление попробовать, ловить асинхронный код.
- Один унифицированный обработчик ошибок в блоке Catch.
Минусы:
- Узел 8+ поставляется с Async ждут встроенным. Для более старых версий требуется транспортер Babel для сервера кода.
- Добавление ключевого слова async не очень интуитивно.
- Использование Async/ждут внутри конструктора обещания – анти-образцом.
4. Опять же, для некоторых библиотек, поддерживающих только обратные вызовы, для поддержки Async/ждут
Заключение
В заключение я бы сказал, что мы преобразовали конкретное использование случая из одной формы обратных вызовов, чтобы обещать, наконец, aSync ждать.
В целом, мой взять на себя это то, что я нашел Async ждут код, чтобы быть действительно чистым и легко понять. Поскольку люди хотят изучать узла, они находят асинхронную бит пугающим заданием. Кроме того, люди из Java, PHP или даже предпосылки Python могут легко начать работу с созданием приложений в узле, не беспокоясь о обратных вызовах/обещаниях.
Надеюсь, что эта статья была полезна. В случае, если есть какие-либо ошибки, пожалуйста, дайте мне знать. Было бы счастливо исправить их.
Оригинал: “https://www.freecodecamp.org/news/moving-from-callbacks-to-async-await-in-node-c3da26460dd1/”