Функциональное программирование на JavaScript

http://reactivex.io/learnrx/

https://rxjs-playground.github.io/

Пять ключевых функций

  1. карта
  2. фильтр
  3. concatAll
  4. уменьшать
  5. молния

Наблюдаемый

последовательность значений, которые производитель данных передает потребителю

В отличие от событий: если мы преобразуем события в наблюдаемые объекты, мы можем использовать мощные функции для их преобразования.

Отличие от массива: направление перемещения данных

карта

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 для указания того, что последовательность данных завершена.