Логотип YeaHub

Промисификация функции (Promisify)

3

JavaScript

Функции

Условие:
Дана функция в стиле error-first callback вида (...args, callback) => void, где callback(err, result) вызывается ровно один раз — либо с ошибкой (err не null, result не важен), либо без ошибки (err равен null, result содержит данные). Функция может принимать произвольное количество аргументов перед колбэком (например, loadScript(url, callback)). Нужно реализовать функцию promisify(asyncFn), которая возвращает новую функцию. Новая функция принимает те же аргументы, что и asyncFn, но без колбэка, сама добавляет колбэк при вызове asyncFn и возвращает Promise, который резолвится значением result, если ошибки не было, и реджектится значением err, если ошибка произошла.

Входные данные: asyncFn — функция вида (...args, callback) => void.

Выходные данные: функция вида (...args) => Promise<result>.

Ограничения:

  • asyncFn вызывает колбэк ровно один раз

  • без реальных задержек (setTimeout) — только микротаски

Пример:
Вход: asyncFn = (url, cb) => Promise.resolve().then(() => cb(null, "loaded:" + url))
Выход: promisify(asyncFn)("script.js") → resolve "loaded:script.js"

Loading...