Функциональное программирование на JavaScript
Пять ключевых функций
- карта
- фильтр
- concatAll
- уменьшать
- молния
Наблюдаемый
последовательность значений, которые производитель данных передает потребителю
В отличие от событий: если мы преобразуем события в наблюдаемые объекты, мы можем использовать мощные функции для их преобразования.
Отличие от массива: направление перемещения данных
карта
function increment (x) { return x + 1 } [1,2,3].map(increment) === [2,3,4] seq([1,,,2,,,3,,,]).map(increment) === seq([2,,,3,,,4,,,])
фильтр
function biggerThan1 (x) { return x > 1; } [1,2,3].filter(biggerThan1) === [2,3] seq([1,,,2,,,3,,,]).filter(biggerThan1) === seq([2,,,3,,,])
concatAll
[ [1, 2, 3], [4, 5, 6] ].concatAll() === [1,2,3,4,5,6] seq([ seq([1,, ,,, ,,,2,,,3]) ,,,seq([4,,,5,,, ,,, ,,6,,,]) ]).concatAll() === seq([1,,,,,,,,2,,,3,4,,,5,,,,,,,,6,,,])
уменьшать
[ 1, 2, 3 ].reduce(sumFunction) === [ 6 ] seq([ 1,,,2,,,3 ]).reduce(sumFunction) === seq([,,,,,,6])
молния
Array.zip([1,2],[3,4,5], sumFunction) === [4,6] Observable.zip(seq([1,,,2]),seq([3,,,4,,,5]), sumFunction) === seq([4,,,6])
брать
[1,2,3].take(2) === [1, 2] seq([ 1,,,2,,,3,,, ]).take(2) === seq([ 1,,,2 ]) var button = document.querySelector("#my-button") // Events var handler = function() { console.log("The button can only be clicked once") button.removeEventListener("click", handler) } button.addEventListener("click", handler) // Observable var buttonClicks = Observable.fromEvent(button, "click") buttonClicks. take(1). forEach(function() { console.log("The button can only be clicked once") })
возьми до
[1,2,3].takeUntil([1]) === [] seq([1,,,2,,,3,,, ]).takeUntil(seq([ ,,, ,,4 , ])) === seq([ 1,,,2 ]) var stopButton = document.querySelector("#stop-button") var stopClicks = Rx.Observable.fromEvent(stopButton, "click") var interval = Rx.Observable.interval(1000) .takeUntil(stopClicks) .forEach(function(value) { console.log(value) })
различноеUntilChanged
seq([1,,,1,,,3,,,3,,,5,,,1,,,]).distinctUntilChanged() === seq([1,,,,,,,3,,,,,,,5,,,1,,,]);
- next(), используемый Observables для доставки новых данных
- error(), используемый Observables для предоставления информации об ошибках.
- complete(), используемый Observables для указания того, что последовательность данных завершена.