84
REACTIVE JAVASCRIPT MIT RXJS - BASTA! 2016 MAXIMILIAN BERGHOFF - 02.03.2016

Reactive java script mit rxjs basta! 2016

Embed Size (px)

Citation preview

Page 1: Reactive java script mit rxjs   basta! 2016

REACTIVE JAVASCRIPT MIT RXJS - BASTA! 2016MAXIMILIAN BERGHOFF - 02.03.2016

Page 2: Reactive java script mit rxjs   basta! 2016

Maximilian [email protected]/electrimaxxxMayflower GmbH - Wü[email protected]

Page 3: Reactive java script mit rxjs   basta! 2016

REACTIVE EXTENSIONS -RX

Page 4: Reactive java script mit rxjs   basta! 2016

HISTORYERIK MEIER

BRAIN BACKMANMATHEW PODWYSOCKI

Page 5: Reactive java script mit rxjs   basta! 2016

LINQ TO EVENTS

Page 6: Reactive java script mit rxjs   basta! 2016

VOLTA

Page 7: Reactive java script mit rxjs   basta! 2016

WINDOWS FORMS<=>

WEB FORMS

Page 8: Reactive java script mit rxjs   basta! 2016

BEISPIEL:

DRAG & DROPMAUSBEWEGUNG VERFOLGEN

Page 9: Reactive java script mit rxjs   basta! 2016

EVENT LISTENER REGISTRIERENelem.addEventListener('mousedown', mousedown, false); elem.addEventListener('mouseup', mouseup, false); elem.addEventListener('mousemove', mousemove, false);

Page 10: Reactive java script mit rxjs   basta! 2016

MOUSE DOWNfunction mousedown(e) isDown = true; state = startX: e.offsetX, startY: e.offsetY;

Page 11: Reactive java script mit rxjs   basta! 2016

MOUSE MOVEfunction mousemove(e) if (!isDown) return; var delta = endX: e.clientX ­ state.startX, endY: e.clientY ­ state.startY ;

Page 12: Reactive java script mit rxjs   basta! 2016

MOUSE UPfunction mouseup (e) isDown = false; state = null;

Page 13: Reactive java script mit rxjs   basta! 2016

UNSUBSCRIBEfunction dispose() elem.removeEventListener('mousedown', mousedown, false); elem.removeEventListener('mouseup', mouseup, false); elem.removeEventListener('mousemove', mousemove, false);

Page 14: Reactive java script mit rxjs   basta! 2016

DIE AKTEURE

Page 15: Reactive java script mit rxjs   basta! 2016

ITERATOR PATTERN

Page 16: Reactive java script mit rxjs   basta! 2016

var Iterator = function () ;

Iterator.prototype.next();

Iterator.prototype.rewind();

Iterator.prototype.current();

Iterator.prototype.hasNext();

Page 17: Reactive java script mit rxjs   basta! 2016

TRAVERSIERENwhile (Iterator.hasNext()) console.log(Iterator.next());

Page 18: Reactive java script mit rxjs   basta! 2016

GEDANKENSPIELListe von CocktailsEigenschaften: id, name, zutaten, prozent, ...Aufgabe: "id & name von allem Contails mit prozent > 5.0"

Page 19: Reactive java script mit rxjs   basta! 2016

var cocktails = [ id: 100001, name: 'Piña Colada', zutaten: [], prozent: 5.0 , id: 100002, name: ' Tequila Sunrise', zutaten: [], prozent: 6.0 , id: 100003, name: ' Long Island', zutaten: [], prozent: 7.0 , ];

Page 20: Reactive java script mit rxjs   basta! 2016

var newList = []; for(var i = 0; i <= cocktails.length; i++) if (cocktails[i].prozent > 5.0) newList.push(id: cocktails[i].id, title: cocktails[i].title)

console.log(newList);

Page 21: Reactive java script mit rxjs   basta! 2016

var newList = []; cocktails.forEach(function (cocktail) if (cocktails[i].prozent > 5.0) newList.push(id: cocktail.id, title: cocktail.title) );

Page 22: Reactive java script mit rxjs   basta! 2016

var godOnes = cocktails .filter(function (cocktail) return cocktail.prozent > 5; ) .map(function (cocktail) return id: cocktail.id, name: cocktail.name; );

Page 23: Reactive java script mit rxjs   basta! 2016

OBSERVER PATTERN

Page 24: Reactive java script mit rxjs   basta! 2016

Observable.prototype.subscribe()

Page 25: Reactive java script mit rxjs   basta! 2016

Observer.prototype.notify()

Page 26: Reactive java script mit rxjs   basta! 2016

var Observable = function () ;

Observable.prototype.subscribe = function () ;

Observable.prototype.unsubscribe = function () ;

var Observer = function () ;

Observer.prototype.notify = function() ;

Page 27: Reactive java script mit rxjs   basta! 2016

WARUM?Entkopplungweniger prozedualer CodeErweiterbarkeit erhöht

Page 28: Reactive java script mit rxjs   basta! 2016

DIE HOCHZEIT

Page 29: Reactive java script mit rxjs   basta! 2016

By Ziko van Dijk (shot by myself) [ or ], GFDL CC BY-SA 3.0 via WikimediaCommons

REACTIVE EXTENSIONRxJavaRxJSRx.NetRx.ScalaRx.ClojureRx.Swift...

Page 30: Reactive java script mit rxjs   basta! 2016

REACTIVEX.IO

Page 31: Reactive java script mit rxjs   basta! 2016

GITHUB.COM/REACTIVE-EXTIONSION

Page 32: Reactive java script mit rxjs   basta! 2016

STREAM VON EVENTS

Page 33: Reactive java script mit rxjs   basta! 2016

var list = [1, 2, 3, 4, 5];

list.forEach(function (item) console.log("nexItem: %s", item); );

Page 34: Reactive java script mit rxjs   basta! 2016

var list = [1, 2, 3, 4, 5];

var source = Rx.Observable.fromArray(list);

var disposal = source.subscribe( function (x) console.log('Next: ' + x);, function (err) console.log('Error: ' + err);, function () console.log('Completed'););

disposal.dispose();

Page 35: Reactive java script mit rxjs   basta! 2016

OBSERVER

Page 36: Reactive java script mit rxjs   basta! 2016

By Vince Alongi (Flickr) [ ], CC BY 2.0 via Wikimedia Commons

var disposal = source.subscribe( function (x) console.log('Next: ' + x);, function (err) console.log('Error: ' + err);, function () console.log('Completed'); );

Page 37: Reactive java script mit rxjs   basta! 2016

function Observer()

Observer.prototype.onNext = function (value) ... ;

Observer.prototype.onError = function (error) ... ;

Observer.prototype.onCompleted = function () ... ;

Page 38: Reactive java script mit rxjs   basta! 2016

var source = Rx.Observable.range(1,10);

var reducedSource = source.filter(function (value) return value % 2 === 0; );

var disposal1 = reducedSource.subscribe( function (x) console.log('Next 1: ' + x);, function (err) console.log('Error 1: ' + err);, function () console.log('Completed 1.'); );disposal1.dispose();

var disposal2 = source.subscribe( function (x) console.log('Next 2: ' + x);, function (err) console.log('Error 2: ' + err);, function () console.log('Completed 2'); );disposal2.dispose();

Page 39: Reactive java script mit rxjs   basta! 2016

> Next 1: 2 > Next 1: 4 > Next 1: 6 > Next 1: 8 > Next 1: 10 > Completed 1. > Next 2: 1 > Next 2: 2 > Next 2: 3 > Next 2: 4 > Next 2: 5 > Next 2: 6 > Next 2: 7 > Next 2: 8 > Next 2: 9 > Next 2: 10 > Completed 2

Page 40: Reactive java script mit rxjs   basta! 2016

OBSERVALBE

Page 41: Reactive java script mit rxjs   basta! 2016

function Disposable()

Disposable.prototype.dispose = function () ...

function Observable()

/** * @return Disposable */Observable.prototype.subscribe = function (observer) ...

Page 42: Reactive java script mit rxjs   basta! 2016

YOUTUBE

Page 43: Reactive java script mit rxjs   basta! 2016

(ER-) ZEUGUNG

Page 44: Reactive java script mit rxjs   basta! 2016

Rx.Observable.create()

Page 45: Reactive java script mit rxjs   basta! 2016

var source = Rx.Observable.create(function (observer) observer.onNext(42); observer.onCompleted(); return function () console.log('disposed'); );

var subscription = source.subscribe( function (x) console.log('onNext: %s', x); , function (e) console.log('onError: %s', e); , function () console.log('onCompleted'); );

subscription.dispose();

Page 46: Reactive java script mit rxjs   basta! 2016

> onNext: 42 > onCompleted > disposed

Page 47: Reactive java script mit rxjs   basta! 2016

Rx.Observable.range()

Page 48: Reactive java script mit rxjs   basta! 2016

var source = Rx.Observable.range(1, 5);

var subscription = source.subscribe( function (x) console.log('onNext: %s', x); , function (e) console.log('onError: %s', e); , function () console.log('onCompleted'); );

Page 49: Reactive java script mit rxjs   basta! 2016

> onNext: 1 > onNext: 2 > onNext: 3 > onNext: 4 > onNext: 5

Page 50: Reactive java script mit rxjs   basta! 2016

Rx.Observable.fromEvent(element, eventName, [selector]) // oderRx.Observable.fromCallback(func, [context], [selector])

Page 51: Reactive java script mit rxjs   basta! 2016

var input = $('#input');

var source = Rx.Observable.fromEvent(input, 'keyup');

var subscription = source.subscribe( function (x) console.log('Next: key pressed!');, function (err) console.log('Error: %s', err);, function () console.log('Completed'););

Page 52: Reactive java script mit rxjs   basta! 2016

var fs = require('fs'), Rx = require('rx');

var exists = Rx.Observable.fromCallback(fs.exists); var source = exists('file.txt');

var subscription = source.subscribe( function (x) console.log('Next: ' + x);, function (err) console.log('Error: ' + err);, function () console.log('Completed'); );

Page 53: Reactive java script mit rxjs   basta! 2016

LINQLANGUAGE INTEGRATED QUERY

Page 54: Reactive java script mit rxjs   basta! 2016

von Unbekannt [Public domain], via Wikimedia Commons

KOMBINATION.concat(); // oder.merge();

Page 55: Reactive java script mit rxjs   basta! 2016

var sourceOne = Rx.Observable.range(1,5); var sourceTwo = Rx.Observable.range(6,5);

var merged = sourceOne.concat(sourceTwo); var disposal = merged.subscribe(function (x) console.log('Concat onNext: ' + x); );

Page 56: Reactive java script mit rxjs   basta! 2016

OUTPUT> Concat onNext: 1 > Concat onNext: 2 > Concat onNext: 3 > Concat onNext: 4 > Concat onNext: 5 > Concat onNext: 6 > Concat onNext: 7 > Concat onNext: 8 > Concat onNext: 9 > Concat onNext: 10

Page 57: Reactive java script mit rxjs   basta! 2016

var sourceOne = Rx.Observable.range(1,5); var sourceTwo = Rx.Observable.range(6,5);

var merged = sourceOne.merge(sourceTwo); var disposal = merged.subscribe(function (x) console.log('Merged onNext: ' + x); );

Page 58: Reactive java script mit rxjs   basta! 2016

OUTPUT> Merged onNext: 1 > Merged onNext: 6 > Merged onNext: 2 > Merged onNext: 7 > Merged onNext: 3 > Merged onNext: 8 > Merged onNext: 4 > Merged onNext: 9 > Merged onNext: 5 > Merged onNext: 10

Page 59: Reactive java script mit rxjs   basta! 2016

FILTER

Page 60: Reactive java script mit rxjs   basta! 2016

var source = Rx.Observable.range(1,10);

var filtered = source.filter(function (x) return x % 2 === 0; );

var disposal = filtered.subscribe(function (x) console.log('onNext: ' + x); );

Page 61: Reactive java script mit rxjs   basta! 2016

OUTPUT> onNext: 2 > onNext: 4 > onNext: 6 > onNext: 8 > onNext: 10

Page 62: Reactive java script mit rxjs   basta! 2016

PROJEKTIONEN

Page 63: Reactive java script mit rxjs   basta! 2016

var list = [ id: 100001, name: 'Piña Colada', zutaten: [], prozent: 5.0 , id: 100002, name: ' Tequila Sunrise', zutaten: [], prozent: 6.0 , id: 100003, name: ' Long Island', zutaten: [], prozent: 7.0 , ];

var source = Rx.Observable.from(list);

var ids = source.map(function (item) return item.id; );

var disposal = ids.subscribe(function (x) console.log('onNext Id: ' + x); );

disposal.dispose();

Page 64: Reactive java script mit rxjs   basta! 2016

OUTPUTonNext Id: 100001 onNext Id: 100002 onNext Id: 100003

Page 65: Reactive java script mit rxjs   basta! 2016

?.flatMap();

Page 66: Reactive java script mit rxjs   basta! 2016

var source = Rx.Observable .range(1, 2) .flatMap(function (x) return Rx.Observable.range(x, 2); );

var subscription = source.subscribe( function (x) console.log('onNext: ' + x); );

Page 67: Reactive java script mit rxjs   basta! 2016

return Rx.Observable.range(1, 2); return Rx.Observable.range(2, 2);

Page 68: Reactive java script mit rxjs   basta! 2016

OUTPUT> onNext: 1 > onNext: 2 > onNext: 2 > onNext: 3

Page 70: Reactive java script mit rxjs   basta! 2016

PROMISES?Single ValueCancellation?

Page 71: Reactive java script mit rxjs   basta! 2016

ARRAY OPERATORENVS.

RX OPERATOREN

Page 72: Reactive java script mit rxjs   basta! 2016

ARRAY OPERATORENKomplette Liste wird durch gereichtdabei auf jedem Eintrag

Projektion - map, ..Gefiltert - reduce, filterErgänzt - concat, merge

Page 73: Reactive java script mit rxjs   basta! 2016

RX OPERTORENJedes Event/Jeder Eintrag einzelndabei

Projektion - map, ..Gefiltert - reduce, filterErgänzt - concat, merge

Filter = STOP => nicht weiter gereichtErgänzung nur der Zugang für weiteren Stream

Page 74: Reactive java script mit rxjs   basta! 2016

ACTION

Page 75: Reactive java script mit rxjs   basta! 2016

von Thiemo Schuff (Eigenes Werk) [ ], CC BY-SA 3.0 via WikimediaCommons

<input type="text" id="input"/>

<h2>Results</h2> <ul id="results"> </ul>

Page 76: Reactive java script mit rxjs   basta! 2016

var $input = $('#input'); var $results = $('#results');

var suggestions = Rx.Observable.fromEvent($input, 'keyup');

Page 77: Reactive java script mit rxjs   basta! 2016

var suggestions = Rx.Observable.fromEvent($input, 'keyup') .pluck('target', 'value') .filter(function(text) return text.length > 2 ) .debounce(500 /* ms */) .distinctUntilChanged();

Page 78: Reactive java script mit rxjs   basta! 2016

... flatMapLatest(function (term) return $.ajax( url: 'https://en.wikipedia.org/w/api.php', dataType: 'jsonp', data: action: 'opensearch', format: 'json', search: term ).promise(); );

Page 79: Reactive java script mit rxjs   basta! 2016

... .subscribe( function(data) $results .empty() .append($.map(data[1], function (value) return $('<li>').text(value); )) , function(error) $results .empty() .append($('<li>')) .text('Error:' + error); );

Page 80: Reactive java script mit rxjs   basta! 2016

JS FIDDLE

Page 81: Reactive java script mit rxjs   basta! 2016

By Musik- och teatermuseet (Own work) [ ], CC BY-SA 3.0 via WikimediaCommons

QUESTIONS?Ask Now!Twitter: @ElectricMaxxxMail: [email protected]

Page 83: Reactive java script mit rxjs   basta! 2016

< <

THANK YOU!

Page 84: Reactive java script mit rxjs   basta! 2016

< <