> Как реализовать функцию promisify в JavaScript (JavaScript)
Уровень: senior · Роль: frontend · Категория: Технические вопросы
Компании: циан
Стек: JavaScript
> Пример ответа
Функция promisify преобразует функцию с колбэком (callback-style) в функцию, возвращающую Promise. Это полезно для работы с устаревшими API, например, fs.readFile в Node.js.
Вот простая реализация:
JAVASCRIPTfunction promisify(fn) {return function(...args) {return new Promise((resolve, reject) => {fn.call(this, ...args, (error, result) => {if (error) {reject(error);} else {resolve(result);}});});};}
Как это работает:
-
Принимает исходную функцию
fn, которая ожидает колбэк последним аргументом. -
Возвращает новую функцию, которая собирает все аргументы (
...args) и создает Promise. -
Внутри Promise вызывается
fnс переданными аргументами и дополнительным колбэком, который либо отклоняет Promise при ошибке, либо разрешает его с результатом.
Пример использования:
JAVASCRIPTconst fs = require('fs');const readFileAsync = promisify(fs.readFile);readFileAsync('file.txt', 'utf8').then(data => console.log(data)).catch(err => console.error(err));
Важные нюансы:
-
Колбэк должен следовать соглашению Node.js: первый аргумент - ошибка, второй - результат.
-
Для методов объектов (например,
fs.readFile) нужно сохранять контекстthis, используяfn.call(this, ...). -
В современных средах можно использовать
util.promisifyиз Node.js, который поддерживает дополнительные символы для кастомизации.
Эта реализация покрывает 90% случаев, но для сложных сценариев (например, колбэк с несколькими результатами) потребуется доработка.
> Похожие задачи по frontend
Можно ли пометить стрелочную функцию как асинхронную в JavaScript
В чем разница каррирования и частичного применения в JavaScript
Как реализовать таймаут с abort для запроса в JavaScript
Можно ли создать функцию для запроса продуктов, которая возвращает промис
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью