Введение
Обработка асинхронных операций с помощью обратного вызова очень скучна, обработка асинхронных операций с помощью promise — это круто. Но асинхронные операции с async
/ await
просто потрясающие.
В этой статье мы научимся преобразовывать обратный вызов старой школы в обещание. Эта статья основана на моих исследованиях и выводах.
Предпосылка
- Как использовать функцию обратного вызова.
- Как использовать обещание в JavaScript.
Зачем использовать обещание вместо обратного вызова?
У обратного вызова много ограничений:
- управление асинхронными запросами.
- плохая читаемость кода.
- трудно обрабатывать ошибки.
Поэтому, чтобы смягчить эти проблемы, мы должны включить обещание в нашу кодовую базу. Чтобы узнать, как работает обещание, ознакомьтесь с моей статьей нажмите здесь (https://medium.com/swlh/promises-in-javascript-c9764cba4a23).
Зачем конвертировать обратный вызов в обещание?
Промисы были представлены в JavaScript в ES6 (также называемом ECMAScript 2015).
До ES6 только обратные вызовы могли обрабатывать асинхронные операции. До ES6 будет написано много библиотек или приложений, использующих обратные вызовы. И эти виды кодовой базы все еще используют обратные вызовы, возможно, потому, что они не поддерживаются активно, или обновление кодовой базы требует огромных усилий.
Мы научимся преобразовывать обратный вызов в обещание, используя стабильную библиотеку узлаа также мы напишем для этой цели обобщенную функцию.
Давайте проверим несколько подходов к преобразованию обратного вызова в обещание:
- Основной подход
При таком подходе мы получим базовое понимание того, как преобразовать обратный вызов в обещание. Учимся на примере.
Рассмотрите пример на основе события загрузки браузера:
Давайте проанализируем пример:
- Функция
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.