Slide 1

Slide 1 text

FUNCTIONAL REACTIVE SYSTEMS LIBERTYJS 2016

Slide 2

Slide 2 text

FUNCTIONAL REACTIVE SYSTEMS YOUR HOST: NATE ABELE ▸ Some PHP frameworks (Li3, CakePHP) ▸ AngularUI Router ▸ Architect @ Radify ▸ [email protected] ▸ @nateabele

Slide 3

Slide 3 text

FUNCTIONAL REACTIVE SYSTEMS ATTENDEE LICENSE AGREEMENT ▸ Permission granted to watch this talk, without restriction ▸ Including but not limited to the right to apply knowledge, learn new things & combine… or disregard entirely ▸ THE TALK IS PROVIDED “AS-IS”, WITHOUT WARRANTY OF ANY KIND ▸ INCLUDING BUT NOT LIMITED TO ▸ MERCHANTABILITY ▸ FITNESS FOR ANY PARTICULAR PURPOSE ▸ NONINFRINGEMENT

Slide 4

Slide 4 text

BUZZWORD BINGO

Slide 5

Slide 5 text

FUNCTIONAL REACTIVE SYSTEMS TERMINOLOGY ▸ Functional: ¯\_(ϑ)_/¯ see Wikipedia ▸ Reactive: Time ▸ Systems: This talk === front-end only

Slide 6

Slide 6 text

FUNCTIONAL REACTIVE SYSTEMS FUNCTIONAL ▸High-order function composition ▸Separate data from behavior ▸Purity

Slide 7

Slide 7 text

FUNCTIONAL REACTIVE SYSTEMS FUNCTIONAL LIBRARIES ▸ Underscore ▸ LoDash

Slide 8

Slide 8 text

FUNCTIONAL REACTIVE SYSTEMS FUNCTIONAL LIBRARIES ▸ Underscore ▸ LoDash LIES

Slide 9

Slide 9 text

FUNCTIONAL REACTIVE SYSTEMS FUNCTIONAL LIBRARIES ▸ Ramda ▸ Underscore ▸ LoDash LIES

Slide 10

Slide 10 text

FUNCTIONAL REACTIVE SYSTEMS FUNCTIONAL var people = [ { name: "Alice" }, { name: "Bob" }, { name: "Dave" }, { name: "Sally" } ]; // -> ["Alice", "Bob", "Dave", "Sally"]

Slide 11

Slide 11 text

FUNCTIONAL REACTIVE SYSTEMS FUNCTIONAL var result = []; for (var i = 0; i < people.length; i++) { result.push(people[i].name); }

Slide 12

Slide 12 text

FUNCTIONAL REACTIVE SYSTEMS FUNCTIONAL var result = []; for (var i = 0; i < people.length; i++) { result.push(people[i].name); doSomethingElse(); <—— Badness }

Slide 13

Slide 13 text

FUNCTIONAL REACTIVE SYSTEMS FUNCTIONAL people.map(person => person.name)

Slide 14

Slide 14 text

FUNCTIONAL REACTIVE SYSTEMS FUNCTIONAL import { prop } from 'ramda'; people.map(prop(‘name'));

Slide 15

Slide 15 text

FUNCTIONAL REACTIVE SYSTEMS FUNCTIONAL import { prop, map } from 'ramda'; const names = map(prop('name')); names(people);

Slide 16

Slide 16 text

FUNCTIONAL REACTIVE SYSTEMS FUNCTIONAL: UNDER THE HOOD import { curry } from 'ramda'; const prop = curry((name, obj) => { return obj[name]; }); // prop(name)(obj) === prop(name, obj) // === prop()()(name)()()(obj)

Slide 17

Slide 17 text

FUNCTIONAL REACTIVE SYSTEMS REACTIVE ▸ The observer pattern ▸ aka publish/subscribe ▸ aka streams ▸ aka observables

Slide 18

Slide 18 text

OBSERVABLES PROMISES VS. FIGHT

Slide 19

Slide 19 text

FUNCTIONAL REACTIVE SYSTEMS PROMISES ▸ Asynchronous ▸ A (possible) future value ▸ Exactly one value ▸ Immutable ▸ Automatic flattening

Slide 20

Slide 20 text

FUNCTIONAL REACTIVE SYSTEMS OBSERVABLES ▸ Synchronous or asynchronous ▸ Zero to ∞ values ▸ No automatic flattening

Slide 21

Slide 21 text

FUNCTIONAL REACTIVE SYSTEMS PROMISE USE CASES ▸ HTTP requests ▸

Slide 22

Slide 22 text

FUNCTIONAL REACTIVE SYSTEMS OBSERVABLE USE CASE ▸ HTTP requests ▸ DOM events ▸ Websockets ▸ Iterators ▸ Arrays ▸ etc.

Slide 23

Slide 23 text

FUNCTIONAL REACTIVE SYSTEMS OBSERVABLE CAPABILITIES ▸ Cancel! ▸ Retry ▸ Replay

Slide 24

Slide 24 text

FUNCTIONAL REACTIVE SYSTEMS OBSERVABLE CAPABILITIES ▸

Slide 25

Slide 25 text

FUNCTIONAL REACTIVE SYSTEMS OBSERVABLE LIBRARIES ▸ BaconJS ▸ HighlandJS ▸ CycleJS ▸ RxJS ▸ Angular 2

Slide 26

Slide 26 text

FUNCTIONAL REACTIVE SYSTEMS OBSERVABLE EXAMPLES var clickStream = Observable.fromEvent(element, ‘click’); clickStream.subscribe(console.log.bind(console, ‘Clicked!’));

Slide 27

Slide 27 text

FUNCTIONAL REACTIVE SYSTEMS OBSERVABLE EXAMPLES clickStream .map(e => ({ x: e.clientX, y: e.clientY })) .subscribe(console.log.bind(console, ‘Coords:’));

Slide 28

Slide 28 text

FUNCTIONAL REACTIVE SYSTEMS OBSERVABLE OPERATORS ▸buffer ▸bufferCount ▸bufferTime ▸bufferToggle ▸bufferWhen ▸combineAll ▸combineLatest ▸concat ▸concatAll ▸concatMap ▸concatMapTo ▸count ▸ debounce ▸ debounceTime ▸ defaultIfEmpty ▸ delay ▸ delayWhen ▸ dematerialize ▸ distinctUntilChanged ▸ do ▸ every ▸ expand ▸ filter ▸ first ▸groupBy ▸ignoreElements ▸last ▸let ▸map ▸mapTo ▸merge ▸mergeMap ▸partition ▸pluck ▸publish ▸race ▸repeat ▸retry ▸retryWhen ▸sample ▸scan ▸share ▸single ▸skip ▸skipUntil ▸…

Slide 29

Slide 29 text

EXAMPLE: TYPEAHEAD

Slide 30

Slide 30 text

FUNCTIONAL REACTIVE SYSTEMS OBSERVABLE EXAMPLES const rxFetch = (url) => Observable.fromPromise( fetch(url).then(res => res.json()) ); Observable.fromEvent(input, 'change') .distinctUntilChanged() .debounceTime(400) .flatMapLatest(term => rxFetch('/search?q=' + term) .subscribe((results) => { /* Update */ })

Slide 31

Slide 31 text

TESTING & DEBUGGING

Slide 32

Slide 32 text

No content

Slide 33

Slide 33 text

FIN