Введение

Обработка асинхронных операций с помощью обратного вызова очень скучна, обработка асинхронных операций с помощью promise — это круто. Но асинхронные операции с async / await просто потрясающие.

В этой статье мы научимся преобразовывать обратный вызов старой школы в обещание. Эта статья основана на моих исследованиях и выводах.

Предпосылка

  • Как использовать функцию обратного вызова.
  • Как использовать обещание в JavaScript.

Зачем использовать обещание вместо обратного вызова?

У обратного вызова много ограничений:

  • управление асинхронными запросами.
  • плохая читаемость кода.
  • трудно обрабатывать ошибки.

Поэтому, чтобы смягчить эти проблемы, мы должны включить обещание в нашу кодовую базу. Чтобы узнать, как работает обещание, ознакомьтесь с моей статьей нажмите здесь (https://medium.com/swlh/promises-in-javascript-c9764cba4a23).

Зачем конвертировать обратный вызов в обещание?

Промисы были представлены в JavaScript в ES6 (также называемом ECMAScript 2015).

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

Мы научимся преобразовывать обратный вызов в обещание, используя стабильную библиотеку узлаа также мы напишем для этой цели обобщенную функцию.

Давайте проверим несколько подходов к преобразованию обратного вызова в обещание:

  1. Основной подход

При таком подходе мы получим базовое понимание того, как преобразовать обратный вызов в обещание. Учимся на примере.

Рассмотрите пример на основе события загрузки браузера:

Давайте проанализируем пример:

  • Функция onLoad возвращает обещание.
  • В функции-исполнителе функция разрешения resolve назначается window.onload.
  • Здесь window.onload и resolve указывают на одну и ту же функцию.
  • Когда сработает событие load, будет выполнена функция разрешения.
  • Итак, теперь будет выполняться обратный вызов then. Обратный вызов then должен содержать код, который будет выполняться после загрузки браузера.

2) Библиотека утилит

Этот подход ограничен средой Node. Библиотека util является стабильной и встроенной в Node, которая предоставляет метод преобразования обратного вызова в обещание.

Рассмотрите пример на основе readFile метода fs модуля.

Пример необходимого условия:

  • Создайте файл данных, который будет читаться, в том же каталоге, что и исполняемый файл.
  • Сохраните имя файла данных как student_marks.txt .

Давайте проанализируем пример:

  • Метод fs.readFile является асинхронным. Он принимает обратный вызов в качестве последнего параметра.
  • Формат callback таков, что он принимает два параметра. Первый параметр — это параметр error. Второй параметр — это результирующие данные, возвращаемые методом.
  • С помощью util.promisify(fs.readFile) создается новая функция из метода fs.readFile. Новая функция возвращает обещание.
  • В приведенном выше примере функция readFileAsync возвращает обещание.

На что следует обратить внимание в отношении util.promisify :

  • Функция, которую необходимо преобразовать, должна принимать функция обратного вызова в качестве последнего параметра.
  • Функция обратного вызова должна принимать только два параметра.
  • Первым параметром обратного вызова должен быть error объект, а вторым параметром должно быть return значение функции.

3) Общий подход

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

promisify это настраиваемая функция, хорошо протестированная, поддерживающая обработку ошибок, которая преобразует обратный вызов в обещание.Его можно использовать как в Node.js, так и в браузерах.

Давайте проанализируем promisify:

  • Принимает 2 аргумента.
  • Первый аргумент func должен быть функцией, которая должна быть функцией обратного вызова.
  • Второй аргумент относится к this, который является контекстом выполнения первого аргумента (func). Значение по умолчанию — null.
  • Возврат promisify — это функция, которая при вызове возвращает Promise.
  • Проверьте приведенный ниже пример использования promisify.

Ниже приведен еще один пример, который обещает функцию Node.js fs.readFile.

Заключение

Помимо подходов, упомянутых в этой статье, могут быть и другие способы, такие как использование сторонних библиотек. Одна из библиотек — Bluebird JS.

Спасибо за чтение!! Приветствуются любые комментарии по содержанию статьи.

Вот ссылка на мой репозиторий Github.