Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Introduction to FRP

Introduction to FRP

An introduction to Functional Reactive Programming - presented at 9th GreeceJS meetup

Stratos Pavlakis

July 21, 2015
Tweet

More Decks by Stratos Pavlakis

Other Decks in Programming

Transcript

  1. reactive paradigm var b = 1, c = 1; var

    a = b + c; // a == 2 b = 10; • // a == ? • // imperative paradigm => a == 2 • // reactive paradigm => a == 11
  2. • User Input • AJAX • Web Sockets / SSE

    • Web Workers • Animations • Cross origin frame communication • Updating the DOM we deal with
  3. • User Input • AJAX • Web Sockets / SSE

    • Web Workers • Animations • Cross origin frame communication • Updating the DOM most are async!
  4. promises $http(endpoint1) .get({q: ‘frp’}) .then(function (data) { console.log(‘We got data

    back from ajax %s’, data); }) .then(function (data) { return $http(endpoint2).get({id: data.id}); })
  5. generators in ES7 async(function main() { var result1 = await

    request( "http://endpoint.1" ); var data = JSON.parse( result1 ); var result2 = await request( "http://endpoint.2?id=" + data.id ); var resp = JSON.parse( result2 ); console.log( "Value: " + resp.value ); })
  6. problems • callback hell • try / catch (except for

    generators) • memory leaks • reduced composability
  7. any number of values Array over any amount of time

    f(time) / async an event stream would be
  8. observables can model • mouse clicks • key presses •

    scrolling • animations • AJAX Polling, Web Sockets • timers • even… constants
  9. mousedown.flatMap((md) => { var startX = md.offsetX, startY = md.offsetY;

    return mousemove.map((mm) => { return { left: mm.clientX - startX, top: mm.clientY - startY }; }).takeUntil(mouseup); }).subscribe((pos) => { dragTarget.style.top = pos.top + 'px'; dragTarget.style.left = pos.left + 'px'; }); drag & drop
  10. requirements • filter queries • throttle requests • retry (overcome

    network glitches) • avoid duplicate requests • match results to latest query • abort no longer valid requests
  11. keyup => results var keyPress = $('#search').keyupAsObservable(); .keyPress.map((ev) => {

    return ev.target.value; }) .filter((text) => { return text.length > 3; }) .debounce(500) .distinctUntilChanged() .flatMapLatest(search.retry(3).takeUntil(keyPress)) .map((d) => { return d.response[1]; }) .subscribe(showResults, showError); throttling no duplicate requests filtering match/abort response/results
  12. things we can do • cancel (can’t do with Promises)

    • be lazy until a subscriber subscribes (cold) • setup datasource on first subscription • teardown datasource on disposal
  13. observable future • TC39 proposal to add to ES7 ◦

    https://github.com/zenparsing/es-observable • Angular 2 first class support • ReactJS first class support
  14. still... • steep learning curve • old habits die hard

    • tricky to work with classic MV* • poor/difficult documentation (is getting better)
  15. Microsoft Research • A Brief Introduction to ActiveVRML - Conan

    Elliott • Functional Reactive Animations - Conan Elliott & Paul Hudak
  16. resources • Fran Tutorial - http://conal.net/fran/tutorial.htm • Simply Reactive -

    http://conal.net/papers/simply-reactive/ • Reactive Extensions - https://github.com/Reactive-Extensions/RxJS • BaconJS - https://baconjs.github.io/ • Async JavaScript with Reactive Extensions (Jafar Husain) ◦ https://www.youtube.com/watch?v=XRYN2xt11Ek • RxJS at Modern Web UI (Ben Lesh) ◦ https://www.youtube.com/watch?v=yk_6eU3Hcwo • http://www.slideshare.net/stefanmayer13/functional-reactive-programming-with-rxjs • https://gist.github.com/staltz/868e7e9bc2a7b8c1f754 • RxJSKoans - https://rxkoans.codeplex.com/ • RxMarbles - http://rxmarbles.com/ • Reactive programming and MVC (Aaron Stacy) ◦ http://aaronstacy.com/writings/reactive-programming-and-mvc/