Я думаю, что вы путаете 2 вещи.Стиль Candy чаще называют функциональной композицией.Вот где выходные данные одной функции являются входными данными для следующей.
f(g(h(1)))
h(1)
выводит значение, и это вход для g
, который выводит значение и является входом для f
.
, который отличается от стиля обратного вызова, используемого в Javascript для асинхронных операций.
f(1,g)
Где f
принимает значение, обрабатывает его и вызывает g
позднее.
Часто в JavaScript вам нужно обрабатывать асинхронные операции, но в таких ситуациях вам нужны только обратные вызовы (продолжения).Такие функции, как ваша stringToLower
, должны только возвращать данные.
function string_to_lower (str) {
return str.toLowerCase();
}
Если бы вы настроили свой код в соответствии с этими правилами, вы могли бы сделать что-то более знакомое:
function TermFrequency(){
read_file(myArgs[0],function(result){
write_out( sort(frequencies(remove_stop_words(remove_non_alphanumeric(string_to_lower(result))))));
}
}
Зная, что это композиция, мы могли бы использовать еще одну функцию, чтобы упростить это еще больше.
function compose (...fns) {
return function (value) {
fns.reduce(function (result, fn) {
return fn(result);
}, value);
}
}
, и мы можем использовать ее так:
const processFile = compose(
string_to_lower,
remove_non_alphanumeric,
remove_stop_words,
frequencies,
sort,
write_out,
);
function TermFrequency(){
read_file(myArgs[0], processFile);
}
Теперь это может выглядеть чуждо, но давайте пройдемсячерез это.Функция compose принимает список аргументов с именем fns
....
(оператор rest) просто принимает отдельные аргументы и помещает их в массив.Вы заметите, что функция compose
возвращает другую функцию.Так что compose(omg)
вернет другую функцию, ожидающую value
.Когда вы указываете значение, функция отключается.Мы вызываем compose
со списком функций, и он возвращает функцию, ожидающую значение.Мы назначаем эту функцию для const
processFile
.Затем мы выполняем нашу асинхронную операцию и устанавливаем processFile
в качестве обратного вызова.Обратный вызов (наша функция compose
) получает ожидаемое значение, а затем выполняет всю обработку синхронно.
Надеюсь, это прояснит некоторые вещи.Я бы также порекомендовал изучить обещания, чтобы вам не приходилось иметь дело с обратными вызовами.
JavaScript интересен тем, что изначально является асинхронным языком.Python с другой стороны нет.Это означает, что в python вы можете использовать и другие стили, но в Javascript бывают случаи, когда вы должны использовать оба стиля.
Кроме того, имейте в виду, что в JavaScript есть обратные вызовы, с помощью которых мы создали обещания, с помощью которыхмы построили Async / Await.Понимание потока обратного вызова необходимо для более эффективного использования инструментов более высокого уровня.