Functional Reactive Programming in Javascript
by
Thomas Gorny
Das Problem
-
Komplexe,
asynchrone
Webanwendungen
- Callback Hell
(function($) {$(function(){$("button").click(function(e) {$.get("/test.json", function(data, textStatus, jqXHR) {$(".list").each(function() {$(this).click(function(e) {setTimeout(function() {alert("Hello World!");}, 1000);});});});});});})(jQuery);
Callbacks Sind böse!
Nur Seiten-Effekte!
- Synchronisierung
- Control Flow
- Error Handling
lösung:
REACTIVE
Functional
Event-Streams
Reactive
A = B + C
B = D + E
REACTIVE
A
=
B
+ C
B = D + E
E ändert sich
⇒ B neu berechnet
⇒ A neu berechnet
Reactive
Data-Binding
Variablen wie Zellen
in Excel-Tabellen
Functional
Pure Functions
f : A → B
Functional
monaden
Behälter für beliebigen Inhalt

FUNCTIONAL
M sind
First Class Values
M sind
Parameter
M sind Return-Werte
M sind Return-Werte

Functional
M.map( f )

Functional
You know Monads!
Array (sequenziell)

FUNCTIONAL
YOU KNOW MONADS!
Promise (asynchron)

EVEnt StrEAms
Container
für
sequenzielle,
asynchrone Werte
Veränderung über die Zeit

Event Streams
stream.map()

EVENT STREAMs
stream.map()
stream.reduce()
stream.filter()
stream.merge()
stream.takeUntil()
stream.flatMap()
...
array.map()
array.reduce()
array.filter()
array.concat()
Event Streams
sind
reaktive,
funktionale
Datenstrukturen
funktionale
Datenstrukturen

Event Streams
Libraries
RxJS
Bacon.js
Achtung : 20 sek Code !
function xyFromEvent(v){ return {x: v.clientX, y: v.clientY} } function getDelta(t){ var a = t[1]; var b = t[0]; return {x: a.x-b.x, y: a.y-b.y}; } function add(p1, p2) { return {x: p1.x + p2.x, y: p1.y + p2.y}; } var startDrag = block.asEventStream('mousedown') var endDrag = block.asEventStream('mouseup') var draggingDeltas = startDrag.flatMap(function() { return html.asEventStream('mousemove') .map(xyFromEvent) .slidingWindow(2,2) .map(getDelta) .takeUntil(endDrag) }) var blockPosition = draggingDeltas.scan({x: 0, y: 0}, add); blockPosition.onValue(function(pos) { block.css({ top : pos.y + "px", left : pos.x + "px" }); });
Danke : )
Functional Reactive Programming in Javascript by Thomas Gorny
Functional Reactive Programming in JavaScript
By Thomas Gorny
Functional Reactive Programming in JavaScript
- 2,227