Реализуйте функцию parallel, которая выполняет массив функций параллельно и собирает их результаты в правильном порядке.
Функция должна принимать два параметра:
functions — массив функций, которые могут быть двух типов:
Асинхронные функции с коллбэком (принимают один параметр resolve);
Синхронные функции (без параметров, возвращают результат сразу).
callback — функция обратного вызова, которая получает массив всех результатов.
Особенности поведения:
Все функции должны выполняться параллельно (одновременно запускаться);
Результаты должны сохраняться в том же порядке, что и функции в исходном массиве;
callback вызывается только после завершения всех функций;
Синхронные функции выполняются мгновенно, асинхронные — в своём темпе.
Пример
parallel([ function (resolve) { setTimeout(() => resolve(10), 50); }, function () { return 5; }, function (resolve) { setTimeout(() => resolve(0), 10); },], function (results) { console.log(results); // [10, 5, 0]});
Решение
Оптимальное решение
// Временная сложность: O(n), n - количество функций в массиве// Пространственная сложность: O(n), n - размер массива totalResult, который хранит результаты всех функцийfunction parallel(functions, callbackFn) { let counter = 0; const totalResult = []; // O(n) - массив размером n functions.forEach((functionItem, index) => { // O(n) - итерация по n элементам if (functionItem.length > 0) { functionItem((result) => { totalResult[index] = result; counter++; if (counter === functions.length) { callbackFn(totalResult); } }); } else { totalResult[index] = functionItem(); counter++; } if (counter === functions.length) { // O(n) - проверка выполняется n раз (по одной на итерацию) callbackFn(totalResult); } });}