Compose на колбэках

Если функция в задаче compose-async принимала асинхронные функции, возвращающие промисы, то в этой задаче функции работают на колбэках.

Как работают функции на колбэках

Например, функция cube возводит число в куб, но делает это асинхронно. Первым аргументом она принимает число, которое нужно возвести, а вторым — колбэк, который выполнится когда вычисления закончатся.

Как правило, в таких функциях колбэк вызывается с двумя аргументами.

Если произошла оишбка, то первый аргумент — эта самая ошибка, второго аргумента нет, фактически он undefined.

cube(3, function (err) { console.log(err); // err !== null, что-то пошло не так })

Если все прошло успешно, то первый аргумент (обозначающий ошибку) null, а второй — результат работы. В нашем примере число 27.

cube(3, function (err, result) { console.log(err); // err === null console.log(result); // result === 27 })

Для тестирования функция cube может быть реализована таким образом:

function cube(x, cb) { setTimeout(() => { if (Math.random() < 0.5) { cb(null, x ** 3); } else { cb(`cube(${x}) error`); } }, 500); }

Что нужно сделать

Допустим, у нас есть несколько асинхронных функций, принимающих колбэки

cube(2, (err, result) => console.log(result === 8)); double(2, (err, result) => console.log(result === 4)); subtract5(2, (err, result) => console.log(result === -3));

Функция compose принимает массив функций в описанном выше формате и возвращает асинхронную функцию, которая имеет такой же интерфейс, как и входные функции.

Результат функции compose последовательно выполняет функции справа налево, передавая результат одной функции в аргумент к другой.

Если по дороге в одной из функций возникла ошибка, функция должна вернуть эту ошибку.

const composed = compose([cube, double, subtract5]); composed(8, (err, result) => { console.log(err, result); });

Функция composed (результат вызова compose):

  • принимает число 8,
  • вычитает из 8 пять, получается 3,
  • усножает 3 на два, получается 6,
  • возводит 6 в куб, получается 216,
  • вызывает колбэк с аргументами null и 216.

Эту задачу можно решить как минимум двумя способами: циклом и с использованием рекурсии.

Эта задача не на промисы. Предполагается, что вы решите задачу без использования промисов.