Решаем задачки. Имитация Promise.all
Имеется недописанная функция parallel. Она принимает массив функций и коллбэк, вызываемый, когда все функции будут обработаны. Возвращает она массив результатов функций - в той последовательности, в которой они были переданы. Это важно!
Нельзя писать код вне функции parallel. Нежелательно использовать промисы.
Вот код:
#задачи
Имеется недописанная функция parallel. Она принимает массив функций и коллбэк, вызываемый, когда все функции будут обработаны. Возвращает она массив результатов функций - в той последовательности, в которой они были переданы. Это важно!
Нельзя писать код вне функции parallel. Нежелательно использовать промисы.
Вот код:
function parallel(funcArray, doneAll) {
}
var a = function(done) {
setTimeout(function() {
done('result a');
}, 300);
};
var b = function(done) {
setTimeout(function() {
done('result b');
}, 200);
};
parallel([a,b], function(results) {
console.log(results); // ['result a', 'result b']
});
Решение - в следующем посте.#задачи
Решаем задачки. "Бесконечное каррирование"
Эта задача популярна на интервью в Amazon. Напишите функцию sum, которую можно вызывать следующим образом:
запутать читателя не допустить ошибок и показать код нагляднее, использую форму c if-ами и TS:
Задача функции - суммировать числа.
Пока в вызовах присутствует аргумент - она продолжает суммировать. Как только появляется вызов без аргумента - вычисления заканчиваются.
Для решения вспомним, что такое каррирование. Это прием, при котором функция возвращает функцию-обертку с фиксированным аргументом. Мы вызываем обертку с новым аргументом - таким образом сокращая написание кода и возможности для ошибок.
Обычно для этого обертки пишут явно. Однако здесь количество аргументов не ограничено, нельзя просто взять и возвращать несколько оберток под их заданное количество.
Бесконечное количество аргументов означает цикл.
В функциональном программировании циклы делают через рекурсию - её и используем.
Вызываем функцию первый раз. Передан агрумент a. На этом шаге функция возвращает обертку.
Вызываем обертку. Она проверяет, передан ли аргумент b.
Если аргумент передан - обертка возвращает изначальную функцию из себя, передав аргументом сумму a + b. Отсюда цикл повторяется, до тех, пока не выполнится условие...
...если аргумента нет. Тогда обертка возвращает a и заканчивает цикл.
Таким образом мы ограничили количество аргументов на отдельных шагах вычислений, чтобы использовать каррирование для неограниченного числа аргументов.
#задачи
Эта задача популярна на интервью в Amazon. Напишите функцию sum, которую можно вызывать следующим образом:
sum(1)() // 1
sum(1)(2)() // 3
sum(1)(2)(-1)() // 2
Решение напишу здесь же. Чтобы const sum = (a: number): number => {
return (b: number): number => {
if (b) {
return sum(a + b)
} else {
return a
}
}
}
Следите за пальцами.Задача функции - суммировать числа.
Пока в вызовах присутствует аргумент - она продолжает суммировать. Как только появляется вызов без аргумента - вычисления заканчиваются.
Для решения вспомним, что такое каррирование. Это прием, при котором функция возвращает функцию-обертку с фиксированным аргументом. Мы вызываем обертку с новым аргументом - таким образом сокращая написание кода и возможности для ошибок.
Обычно для этого обертки пишут явно. Однако здесь количество аргументов не ограничено, нельзя просто взять и возвращать несколько оберток под их заданное количество.
Бесконечное количество аргументов означает цикл.
В функциональном программировании циклы делают через рекурсию - её и используем.
Вызываем функцию первый раз. Передан агрумент a. На этом шаге функция возвращает обертку.
Вызываем обертку. Она проверяет, передан ли аргумент b.
Если аргумент передан - обертка возвращает изначальную функцию из себя, передав аргументом сумму a + b. Отсюда цикл повторяется, до тех, пока не выполнится условие...
...если аргумента нет. Тогда обертка возвращает a и заканчивает цикл.
Таким образом мы ограничили количество аргументов на отдельных шагах вычислений, чтобы использовать каррирование для неограниченного числа аргументов.
#задачи