reactive programming

18
sunscrapers.com Your favored tech partner. Reactive Programming Kuba Włodarczyk

Upload: sunscrapers

Post on 21-Feb-2017

119 views

Category:

Internet


0 download

TRANSCRIPT

sunscrapers.comYour favored tech partner.

Reactive ProgrammingKuba Włodarczyk

sunscrapers.comYour favored tech partner.

Aplikacje webowe kiedyś

sunscrapers.comYour favored tech partner.

Aplikacje webowe dziś

sunscrapers.comYour favored tech partner.

Czym jest programowanie reaktywne?

Reactive Programming Manifesto (http://www.reactivemanifesto.org/)

Cztery główne reguły RP:

- Responsive- Scalable- Resilent- Message-driven architecuture

sunscrapers.comYour favored tech partner.

SPA (Single Page Application)

Aplikacja w przeglądarce • strona pobierana raz • mnóstwo logiki po stronie klienta • strona nie przeładowywuje się • dane (JSON, asynch, PUSH)

sunscrapers.comYour favored tech partner.

Droga do SPA: etap 1 - callback

sunscrapers.comYour favored tech partner.

Callback hell

sunscrapers.comYour favored tech partner.

Droga do SPA: etap 2 - promise

sunscrapers.comYour favored tech partner.

Promise hell

sunscrapers.comYour favored tech partner.

Observable na ratunek - Rx__

● Implementacje w wielu językach (JavaScript, Python, .Net, Java, Scala, Haskell, Closure, …)

● Duża społeczność i obszerne dokumentacje

● Używane przez dużych graczy na rynku (Netflix)

sunscrapers.comYour favored tech partner.

RxJS w praktyce

Wszystko w naszej aplikacji jest strumieniem

Sposób tworzenia strumienia:- Z eventów (Event)- Z NodeCallback- Z tablicy (Array)- Bezpośrednio: Observable.create

sunscrapers.comYour favored tech partner.

RxJS w praktycelet observable = Observable.create((observer) =>

// some async operations

observer.onNext('hello'));

// or observer.onError('Error occurs'));

// or observer.onComplete('Stream ends’));

observable.subscribe((value) => console.log(value)(err) => console.log(err));

sunscrapers.comYour favored tech partner.

RxJS w praktyce // event let input = $('input');

Observable.fromEvent(input, 'keyup') .subscribe(() => console.log('keyup!'));

input.trigger('keyup'); // logs "keyup!"

input.trigger('keyup'); // logs "keyup!"

// array Observable.fromArray([1, 2, 3, 4, 5]) .subscribe(x => console.log(x)); // 1, 2, 3, 4, 5

sunscrapers.comYour favored tech partner.

Operacje na strumieniach

● Filter● Map● Reduce● Merge● Zip● flatMap● debounce● …

---> http://rxmarbles.com/

sunscrapers.comYour favored tech partner.

Przykład: debouncer

var q = document.querySelector('#query');

var observable = Rx.Observable.fromEvent(q, 'keyup')

.debounce(300)

.map(function (ev) { return ev.target.value; })

.where(function (text) { return text.length >= 3; })

.distinctUntilChanged()

.map(searchFor)

.switch()

.where(function (obj) { return obj !== undefined; });

sunscrapers.comYour favored tech partner.

Przykład: debouncerfunction searchFor(text) {

var xhr = new XMLHttpRequest();

xhr.open('GET', apibaseUrl + '?q=' + text, true);

xhr.send();

return Rx.Observable.fromEvent(xhr, 'load').map(function (ev) {

var request = ev.currentTarget;

if (request.status === 200) {

var response = request.responseText;

return JSON.parse(response);

}

});

}

sunscrapers.comYour favored tech partner.

Wnioski

- Potężne narzędzie do pisania asynchronicznego kodu w różnych językach

- Rozwiązuje wiele problemów związanych z zarządzaniem zasobami i zarządzaniem błędami

- Wspiera przy tworzeniu modularnego kodu

- Nacisk na stosowanie we współczesnych i przyszłych frameworkach SPA ( np. React i Angular2)

sunscrapers.comYour favored tech partner.

Pytania?

Dziękuję za uwagę