Поскольку JavaScript известен как однопоточный язык, асинхронность является ключом к хорошей производительности кода.

В самом начале были только «колбэки», потом появились промисы, а теперь еще и async/await. Несмотря на то, что новый код с использованием «обратных вызовов» создается редко, код, использующий их, все же существует. В большинстве обычных случаев мы будем использовать Promise или async/await. Давайте рассмотрим разные примеры для каждого случая и несколько советов по выбору между ними.

Обратные вызовы

Даже когда в новых версиях API некоторые модули были обновлены для использования поведения на основе промисов, все же важные модули используют обратные вызовы. Важным из них могут быть «потоки».

Потоки по-прежнему зависят от обратных вызовов, давайте посмотрим на пример.

Как мы видим, единственный способ узнать, когда процесс записи заканчивается, — это использовать обратный вызов для получения звонка, когда он заканчивается.

Конечно, если вы хотите, вы можете изменить это и использовать промис для инкапсуляции процесса обратного вызова. Посмотрим, как.

Обещания

Промисы стали способом для асинхронных задач. Собственный API Promise был улучшен с новыми версиями ECMAScript, и у нас всегда есть такие модули, как bluebird, которые дают нам такие вещи, как .tap, .props, .map или ловят для конкретной ошибки (аналогично тому, что мы можем делать на таких языках, как Java).

Promise помогает нам создавать красивый код в функциональном стиле, который заставляет нас рассматривать код как процесс, состоящий из различных шагов. Давайте посмотрим пример.

Как мы видим, довольно легко следить за процессом и понимать весь процесс. В этом случае процесс использует способ передачи объекта между функциями, и каждый шаг дополняет данные для следующего шага. Но иногда это невозможно или, может быть, мы не хотим создавать большой объект и передавать его каждому методу, потому что этот метод может быть внешним и нуждаться в конкретном вводе и иметь определенный вывод, или процесс должен сохранять данные для использования. позже. Давайте для примера.

Асинхронно/ждите

Этот способ создания асинхронного кода помогает нам иметь более императивный код, и иногда его легче читать, чем цепочку обещаний. Это также помогает нам, когда нам нужно получить разные данные и сохранить их для последующего использования или избежать создания сложных структур. Давайте посмотрим на пример предыдущего кода, использующего async/await.

Иногда, когда мы переключаемся на использование async/await вместо Promise, мы можем выбрать менее производительную реализацию. В последнем примере «getFriends» и «getEnemies» не зависят друг от друга, и их можно вызывать одновременно, но наша реализация заставляет нас ждать завершения одного перед запуском другого. Давайте посмотрим, как мы можем улучшить это.

Как мы видели в последнем примере, их комбинация может сделать наш код легко читаемым и при этом производительным.

Таким образом, существуют разные способы создания асинхронного кода в Node.js. Выбор лучшего способа для каждого случая зависит от нас. Для меня это некоторые правила (от более важных к менее важным), которым нужно следовать при создании моего кода:

  • Легко читать. Код предназначен для коллег, поэтому сделайте его понятным.
  • Легко расширить-изменить.
  • Сделайте его максимально производительным, не нарушая предыдущие.

Больше контента на plainenglish.io. Подпишитесь на нашу бесплатную еженедельную рассылку здесь.