Обратный вызов — это функция, отправляемая в качестве аргумента другой функции. Обратный вызов выполняется, когда конкретная задача завершена или когда происходит событие. Это предшественник обещаний. Промисы, хотя и выполняют те же функции, что и обратный вызов, гораздо легче читаются и компактнее. Старые модули используют обратные вызовы, тогда как новые хорошо работают с промисами. Это затрудняет их работу друг с другом. Кроме того, функциональные модули, использующие обратные вызовы, нельзя использовать с async/await. Один из способов использования функций обратного вызова в таких сценариях — преобразовать их в промисы.

Этот пост о том, как преобразовать функции обратного вызова в промисы. В качестве примера рассмотрим метод функции, который принимает обратный вызов в качестве аргумента.

Он принимает 2 числа, задерживается на 10 секунд через таймер и отправляет обратно их сумму.

Первый шаг — обернуть эту функцию обратного вызова в промис. Обещание принимает два аргумента: разрешение и отклонение.

Текущая задача откладывается: вызовите функцию «разрешить», если задача завершается, как предполагалось, и функцию «отклонить», если задача не удалась. Оборачиваем предыдущую функцию внутри другой функции, скажем, функции «promisify»:

Обратите внимание, что приведенная выше функция возвращает другую функцию. Функция будет возвращать обещание и, следовательно, может использоваться в модуле async/await. Используется оператор расширения, который позволяет развернуть массив в список аргументов, принимаемых функцией. В блоке (2) мы берем аргументы, отправленные функции, и добавляем к аргументам собственный обратный вызов:

Этот обратный вызов отправляется методу вместе с остальными предполагаемыми аргументами. Затем вызывается метод:

Оператор расширения (…аргументы) расширяет список аргументов следующим образом:

Приведенный выше блок приводит к методу, который возвращает обещание. Таким образом, код выглядел так, как показано ниже:

После преобразования в обещание это выглядит так:

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