> Как реализовать функцию promisify в JavaScript (JavaScript)

Уровень: senior · Роль: frontend · Категория: Технические вопросы

Компании: циан

Стек: JavaScript

> Пример ответа

Функция promisify преобразует функцию с колбэком (callback-style) в функцию, возвращающую Promise. Это полезно для работы с устаревшими API, например, fs.readFile в Node.js.

Вот простая реализация:

JAVASCRIPT
function 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 при ошибке, либо разрешает его с результатом.

Пример использования:

JAVASCRIPT
const 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% случаев, но для сложных сценариев (например, колбэк с несколькими результатами) потребуется доработка.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью