Обернуть функцию с error-first колбэком, чтобы она возвращала промис
Реализуйте promisify(fn), превращающую функцию в стиле Node с error-first колбэком в функцию, возвращающую промис. Требования: возвращаемая функция передаёт все аргументы в fn, добавляет колбэк (err, result); при наличии err — reject, иначе resolve со result. Сохраните this вызывающего.
function promisify(fn) {
// ваш код здесь
}
Допишите реализацию.
Верните обёртку, создающую new Promise и вызывающую fn.apply(this, [...args, cb]), где cb = (err, result) => err ? reject(err) : resolve(result). Обычная функция для обёртки (не стрелочная) и apply(this, …) сохраняют исходный this, а добавление колбэка последним соответствует error-first-соглашению.
- ✗Использовать стрелочную функцию для обёртки, теряя
thisвызывающего - ✗Забыть про reject — молча проглатывая аргумент
errиз error-first колбэка - ✗Вызывать
fn(args)вместо добавления колбэка последним аргументом
- →Почему обёртка должна быть обычной, а не стрелочной функцией, чтобы сохранить
this? - →Как обработать колбэк, отдающий несколько аргументов результата?
Решение
Обёртка строит промис и подставляет последним аргументом error-first колбэк.
function promisify(fn) {
return function (...args) {
return new Promise((resolve, reject) => {
fn.apply(this, [...args, (err, result) => {
if (err) reject(err);
else resolve(result);
}]);
});
};
}
Как это работает
Возвращаемая функция — обычная (function), чтобы получить this точки вызова, и пробрасывает его в fn через apply. Все исходные аргументы передаются как есть, а в конец добавляется колбэк (err, result). Колбэк отражает соглашение error-first: ненулевой err ведёт к reject, иначе result идёт в resolve. Так любую функцию в стиле Node можно использовать с await.