В этой задаче нужно реализовать функцию-декоратор promisify
. Она принимает классическую асинхронную функцию на колбэках, а возвращает функцию, возвращающую промис.
Рассмотрим пример функции на колбэках. Функция sum
принимает три аргумента. Первые два — a
и b
— сущностные, это числа которые нужно сложить. Последний — cb
— технический. Это колбэк, который вызывается с результатом работы функции, когда она завершила работу.
Колбэк принимает два аргумента: err
и result
. Если функция завершилась успешно, то err
равен null
, а result
— сумме чисел. Если произошла ошибка, err
равен какому-то значению, отличному от null
, а result
равен undefined
.
// sum — пример реализации такой функции function sum(a, b, cb) { setTimeout(() => { if (Math.random() < .5) { cb(null, a + b); // success } else { cb("error"); // bad luck } }, 0); } // как бы мы ее использовали sum(2, 5, (err, result) => { if (err === null) { console.log(result); // 7 } });
Теперь вызовем promisify
от нашей устаревшей функции sum
. Она вернет новую функцию, которая принимает только два аргумента и возвращает промис.
const promisifiedSum = promisify(sum); // как мы работаем с асинхронными функциями на сегодняшний день promisifiedSum(3, 4).then( value => console.log(value), // 7 reason => console.log(reason), // "error" );