Если функция в задаче 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
):
null
и 216
.Эту задачу можно решить как минимум двумя способами: циклом и с использованием рекурсии.
Эта задача не на промисы. Предполагается, что вы решите задачу без использования промисов.