Промисификация функции (Promisify)
3
Функции
Условие:
Дана функция в стиле 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"