Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Introduction to FRP
Search
Stratos Pavlakis
July 21, 2015
Programming
260
3
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Introduction to FRP
An introduction to Functional Reactive Programming - presented at 9th GreeceJS meetup
Stratos Pavlakis
July 21, 2015
More Decks by Stratos Pavlakis
See All by Stratos Pavlakis
Intro to Remix
pavlakis
0
190
Gitting like a pro - Take 2.pdf
pavlakis
0
75
4th Virtual GreeceJS - Tech News
pavlakis
0
38
3rd Virtual GreeceJS - Tech News
pavlakis
0
49
PWAs: the Application Shell & the well of surprises
pavlakis
1
220
Error Handling in Javascript
pavlakis
1
230
Gitting like a Pro
pavlakis
1
290
Async Patterns & Paradigms in Javascript
pavlakis
4
330
Going Mobile
pavlakis
2
220
Other Decks in Programming
See All in Programming
はてなアカウント基盤 State of the Union
cockscomb
1
1.3k
Go1.27で導入されるジェネリクスメソッドでできること
mackee
0
250
「AIで開発し、AIを届ける」をEvalでつなぐ 〜AIネイティブに始めるプロダクト開発の実践〜 / Connecting "Develop with AI, deliver AI" with Eval
rkaga
4
5.7k
音楽のための関数型プログラミング言語mimiumにおける多段階計算の活用
tomoyanonymous
1
290
Language Server 使ってる? 〜VSCode と Zed の場合〜 / Are you using a Language Server? ~For VS Code and Zed~
handlename
0
840
SLOをサービス品質の共通言語にするために 取り組んできたこと
wakana0222
0
410
Developing with AI Agents — Codex, Claude Code & Cowork Practical Guide
x5gtrn
PRO
0
1.3k
Creating Composable Callables in Contemporary C++
rollbear
0
190
act1-costs.pdf
sumedhbala
0
190
TSKaigi Night Talks 2026_TypeScriptでサプライチェーンの整合性を型に閉じ込める
geekplus_tech
0
430
Hatena Engineer Seminar #37「言語モデルの活用に関する研究」
slashnephy
0
500
Mujeres en SEO Summit 2026 - Greatest Disaster Hits en Web Performance
guaca
0
240
Featured
See All Featured
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
1
220
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
Optimising Largest Contentful Paint
csswizardry
37
3.8k
Game over? The fight for quality and originality in the time of robots
wayneb77
1
220
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
2.9k
Designing for Timeless Needs
cassininazir
1
280
Faster Mobile Websites
deanohume
310
32k
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
460
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
610
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
170
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
1
350
Transcript
Functional Reactive Programming in Javascript
whoami Stratos Pavlakis Workable UI Tech Lead
[email protected]
th3hunt FRP
newbie!
what’s FRP?
let’s begin with
http://www.reactivemanifesto.org/ Responsive Message Driven Resilient Elastic
sweet dreams
so better start with
reactive paradigm var b = 1, c = 1; var
a = b + c; // a == 2 b = 10; • // a == ? • // imperative paradigm => a == 2 • // reactive paradigm => a == 11
front end development is it synchronous or asynchronous?
• User Input • AJAX • Web Sockets / SSE
• Web Workers • Animations • Cross origin frame communication • Updating the DOM we deal with
• User Input • AJAX • Web Sockets / SSE
• Web Workers • Animations • Cross origin frame communication • Updating the DOM most are async!
tools we use
callbacks var el = document.getElementById("my-button"); el.addEventListener("click", function () { console.log(‘my
button was clicked’); });
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}); })
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 ); })
problems • callback hell • try / catch (except for
generators) • memory leaks • reduced composability
event driven programming we react to events
is reason about event streams what we’re really trying to
do
any number of values Array over any amount of time
f(time) / async an event stream would be
first class citizen of FRP observable
Observer Iterator Gang of Four - Design Patterns ES6 EventEmitter
array VS event
array === collection
events === collection
collections are iterable
observable === collection + time
observable API var subscription = myObservable.subscribe(function (val) { console.log(‘Next: %s’,
val); });
from the EventEmitter? so… how is that different
we know when it’s done var subscription = myObservable.subscribe( onNext,
onError, onCompleted ); like promises
we got set operators • map • flatMap • reduce
• merge • concat • zip
more operators • debounce • buffer • skipUntil • flatMapLatest
• combineLatest • switch • retry
observables can model • mouse clicks • key presses •
scrolling • animations • AJAX Polling, Web Sockets • timers • even… constants
operators http://rxmarbles.com/
filter
debounce
distinctUntilChanged
takeUntil
example please!
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
Autocomplete yes I know, the classic example
requirements • filter queries • throttle requests • retry (overcome
network glitches) • avoid duplicate requests • match results to latest query • abort no longer valid requests
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
gets even better
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
not convinced yet?
observable future • TC39 proposal to add to ES7 ◦
https://github.com/zenparsing/es-observable • Angular 2 first class support • ReactJS first class support
http://victorsavkin.com/post/108837493941/better-support-for-functional-programming-in
Rx in production
still... • steep learning curve • old habits die hard
• tricky to work with classic MV* • poor/difficult documentation (is getting better)
libraries
• Rx.js (port of Reactive Extensions to JS) • Bacon.js
• Kefir (faster bacon :)
origins
Microsoft Research • A Brief Introduction to ActiveVRML - Conan
Elliott • Functional Reactive Animations - Conan Elliott & Paul Hudak
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/
None
Questions?