SlideShare ist ein Scribd-Unternehmen logo
1 von 18
sunscrapers.comYour favored tech partner.
Reactive Programming
Kuba 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 praktyce
let 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: debouncer
function 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ę

Weitere ähnliche Inhalte

Andere mochten auch

ReactiveX-SEA
ReactiveX-SEAReactiveX-SEA
ReactiveX-SEA
Yang Yang
 

Andere mochten auch (20)

DVCS Workflows for Teams - Bartek Rychlicki
DVCS Workflows for Teams - Bartek RychlickiDVCS Workflows for Teams - Bartek Rychlicki
DVCS Workflows for Teams - Bartek Rychlicki
 
How to justify your recommendation - Łukasz Karwacki
How to justify your recommendation - Łukasz KarwackiHow to justify your recommendation - Łukasz Karwacki
How to justify your recommendation - Łukasz Karwacki
 
Jaka przyszłość czeka polskich programistów?
Jaka przyszłość czeka polskich programistów?Jaka przyszłość czeka polskich programistów?
Jaka przyszłość czeka polskich programistów?
 
Creating value for customers - understanding context
Creating value for customers - understanding contextCreating value for customers - understanding context
Creating value for customers - understanding context
 
Django ORM - Marcin Markiewicz
Django ORM - Marcin Markiewicz Django ORM - Marcin Markiewicz
Django ORM - Marcin Markiewicz
 
Py2 - Py3 migration - Krzysztof Skarupa
Py2  - Py3 migration - Krzysztof SkarupaPy2  - Py3 migration - Krzysztof Skarupa
Py2 - Py3 migration - Krzysztof Skarupa
 
Foundations of Foundation 6 - Jakub Włodaczyk (pl)
Foundations of Foundation 6 - Jakub Włodaczyk (pl)Foundations of Foundation 6 - Jakub Włodaczyk (pl)
Foundations of Foundation 6 - Jakub Włodaczyk (pl)
 
Introduction to ReactJS - Comparison to AngularJS 2 - Robert Piękoś (pl)
Introduction to ReactJS - Comparison to AngularJS 2 - Robert Piękoś (pl)Introduction to ReactJS - Comparison to AngularJS 2 - Robert Piękoś (pl)
Introduction to ReactJS - Comparison to AngularJS 2 - Robert Piękoś (pl)
 
PostgreSQL and JSON with Python - Przemek Lewandowski
PostgreSQL and JSON  with Python - Przemek Lewandowski PostgreSQL and JSON  with Python - Przemek Lewandowski
PostgreSQL and JSON with Python - Przemek Lewandowski
 
FRP with Ractive and RxJS
FRP with Ractive and RxJSFRP with Ractive and RxJS
FRP with Ractive and RxJS
 
ReactiveX-SEA
ReactiveX-SEAReactiveX-SEA
ReactiveX-SEA
 
Progressive Web Apps
Progressive Web AppsProgressive Web Apps
Progressive Web Apps
 
Programação reativa com RxJS e Angular
Programação reativa com RxJS e AngularProgramação reativa com RxJS e Angular
Programação reativa com RxJS e Angular
 
Add Some Fun to Your Functional Programming With RXJS
Add Some Fun to Your Functional Programming With RXJSAdd Some Fun to Your Functional Programming With RXJS
Add Some Fun to Your Functional Programming With RXJS
 
RxJS Evolved
RxJS EvolvedRxJS Evolved
RxJS Evolved
 
RxJS - The Reactive extensions for JavaScript
RxJS - The Reactive extensions for JavaScriptRxJS - The Reactive extensions for JavaScript
RxJS - The Reactive extensions for JavaScript
 
Functional Reactive Angular 2
Functional Reactive Angular 2 Functional Reactive Angular 2
Functional Reactive Angular 2
 
Angular2 + rxjs
Angular2 + rxjsAngular2 + rxjs
Angular2 + rxjs
 
Rxjs ngvikings
Rxjs ngvikingsRxjs ngvikings
Rxjs ngvikings
 
Rxjs ppt
Rxjs pptRxjs ppt
Rxjs ppt
 

Ähnlich wie Reactive programming

Modsecurity-czy-Twoj-WAF-to-potrafi-Leszek-Mis-Linux-Polska
Modsecurity-czy-Twoj-WAF-to-potrafi-Leszek-Mis-Linux-PolskaModsecurity-czy-Twoj-WAF-to-potrafi-Leszek-Mis-Linux-Polska
Modsecurity-czy-Twoj-WAF-to-potrafi-Leszek-Mis-Linux-Polska
Leszek Mi?
 
infoShare 2011 - Jacek Laskowski - Programowanie Funkcjonalne Funkcyjnie z Cl...
infoShare 2011 - Jacek Laskowski - Programowanie Funkcjonalne Funkcyjnie z Cl...infoShare 2011 - Jacek Laskowski - Programowanie Funkcjonalne Funkcyjnie z Cl...
infoShare 2011 - Jacek Laskowski - Programowanie Funkcjonalne Funkcyjnie z Cl...
Infoshare
 

Ähnlich wie Reactive programming (20)

Platforma Kontentowa
Platforma KontentowaPlatforma Kontentowa
Platforma Kontentowa
 
Tworzenie, zaciemnianie i analiza złośliwego kodu JavaScript
Tworzenie, zaciemnianie i analiza złośliwego kodu JavaScriptTworzenie, zaciemnianie i analiza złośliwego kodu JavaScript
Tworzenie, zaciemnianie i analiza złośliwego kodu JavaScript
 
Modsecurity-czy-Twoj-WAF-to-potrafi-Leszek-Mis-Linux-Polska
Modsecurity-czy-Twoj-WAF-to-potrafi-Leszek-Mis-Linux-PolskaModsecurity-czy-Twoj-WAF-to-potrafi-Leszek-Mis-Linux-Polska
Modsecurity-czy-Twoj-WAF-to-potrafi-Leszek-Mis-Linux-Polska
 
RxJS okiem doświadczonego inżyniera - Angular Warsaw #13
RxJS okiem doświadczonego inżyniera - Angular Warsaw #13RxJS okiem doświadczonego inżyniera - Angular Warsaw #13
RxJS okiem doświadczonego inżyniera - Angular Warsaw #13
 
Asynchroniczne testy JavaScript aplikacji webowych
Asynchroniczne testy JavaScript aplikacji webowychAsynchroniczne testy JavaScript aplikacji webowych
Asynchroniczne testy JavaScript aplikacji webowych
 
Iron Python I Dlr
Iron Python I DlrIron Python I Dlr
Iron Python I Dlr
 
ASP.NET MVC - najważniejsze założenia
ASP.NET MVC - najważniejsze założeniaASP.NET MVC - najważniejsze założenia
ASP.NET MVC - najważniejsze założenia
 
[WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro
[WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro[WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro
[WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro
 
Bezpieczenstwo Portali Spolecznosciowych W Ujeciu Robakow Web 20 Pingwinaria2009
Bezpieczenstwo Portali Spolecznosciowych W Ujeciu Robakow Web 20 Pingwinaria2009Bezpieczenstwo Portali Spolecznosciowych W Ujeciu Robakow Web 20 Pingwinaria2009
Bezpieczenstwo Portali Spolecznosciowych W Ujeciu Robakow Web 20 Pingwinaria2009
 
infoShare 2011 - Jacek Laskowski - Programowanie Funkcjonalne Funkcyjnie z Cl...
infoShare 2011 - Jacek Laskowski - Programowanie Funkcjonalne Funkcyjnie z Cl...infoShare 2011 - Jacek Laskowski - Programowanie Funkcjonalne Funkcyjnie z Cl...
infoShare 2011 - Jacek Laskowski - Programowanie Funkcjonalne Funkcyjnie z Cl...
 
Monitoring sieci
Monitoring sieciMonitoring sieci
Monitoring sieci
 
PLNOG22 - Piotr Stolarek - Bezpieczeństwo użytkowania platform usługowych Tel...
PLNOG22 - Piotr Stolarek - Bezpieczeństwo użytkowania platform usługowych Tel...PLNOG22 - Piotr Stolarek - Bezpieczeństwo użytkowania platform usługowych Tel...
PLNOG22 - Piotr Stolarek - Bezpieczeństwo użytkowania platform usługowych Tel...
 
Wjug from java to big data
Wjug   from java to big dataWjug   from java to big data
Wjug from java to big data
 
Django od developerki po produkcję (linux)
Django od developerki po produkcję (linux)Django od developerki po produkcję (linux)
Django od developerki po produkcję (linux)
 
JDD2014: JAVA.util.concurrent czyli wielowątkowość z różnych perspektyw, tych...
JDD2014: JAVA.util.concurrent czyli wielowątkowość z różnych perspektyw, tych...JDD2014: JAVA.util.concurrent czyli wielowątkowość z różnych perspektyw, tych...
JDD2014: JAVA.util.concurrent czyli wielowątkowość z różnych perspektyw, tych...
 
Testowanie bezpieczeństwa aplikacji dedykowanych na platformę Android
Testowanie bezpieczeństwa aplikacji dedykowanych na platformę AndroidTestowanie bezpieczeństwa aplikacji dedykowanych na platformę Android
Testowanie bezpieczeństwa aplikacji dedykowanych na platformę Android
 
tRPC - czy to koniec GraphQL?
tRPC - czy to koniec GraphQL?tRPC - czy to koniec GraphQL?
tRPC - czy to koniec GraphQL?
 
CONFidence 2018: "Small money, a lot of bugs" - Large scale bughunting dla ty...
CONFidence 2018: "Small money, a lot of bugs" - Large scale bughunting dla ty...CONFidence 2018: "Small money, a lot of bugs" - Large scale bughunting dla ty...
CONFidence 2018: "Small money, a lot of bugs" - Large scale bughunting dla ty...
 
Android i REST
Android i RESTAndroid i REST
Android i REST
 
Michał Dec - Quality in Clouds
Michał Dec - Quality in CloudsMichał Dec - Quality in Clouds
Michał Dec - Quality in Clouds
 

Reactive programming

  • 1. sunscrapers.comYour favored tech partner. Reactive Programming Kuba Włodarczyk
  • 2. sunscrapers.comYour favored tech partner. Aplikacje webowe kiedyś
  • 3. sunscrapers.comYour favored tech partner. Aplikacje webowe dziś
  • 4. 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
  • 5. 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)
  • 6. sunscrapers.comYour favored tech partner. Droga do SPA: etap 1 - callback
  • 7. sunscrapers.comYour favored tech partner. Callback hell
  • 8. sunscrapers.comYour favored tech partner. Droga do SPA: etap 2 - promise
  • 9. sunscrapers.comYour favored tech partner. Promise hell
  • 10. 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)
  • 11. 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
  • 12. sunscrapers.comYour favored tech partner. RxJS w praktyce let 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) );
  • 13. 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
  • 14. sunscrapers.comYour favored tech partner. Operacje na strumieniach ● Filter ● Map ● Reduce ● Merge ● Zip ● flatMap ● debounce ● … ---> http://rxmarbles.com/
  • 15. 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; });
  • 16. sunscrapers.comYour favored tech partner. Przykład: debouncer function 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); } }); }
  • 17. 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)
  • 18. sunscrapers.comYour favored tech partner. Pytania? Dziękuję za uwagę

Hinweis der Redaktion

  1. W kilku zdaniach czym jest programowanie reaktywne Rys historyczny aplikacji webowych w kontekcie reactive programming Zastosowanie na przykładzie implementacji w języku Javascript - RxJS
  2. Prosta struktura Synchroniczny przepływ informacji
  3. Rozbudowana struktura, zewnętrzne aplikacje, duża asynchroniczność w komunikacji Problemy: Wydajność – Tradycyjne blokujące wołanie oraz obsługa to cios dla klienta i serwera ● Niezawodność – Części systemu mogą ulec awarii – Komunikacja jest niepewna – Zależymy od usług dostarczanych z zewnątrz Dzięki podejściu reaktywnemu: Sterowane zdarzeniami (event-driven) systemy mogą być: – Skalowalne (scalable) – Zdolne do samoleczenia (resilient) ● Dzięki czemu użytkownik obserwuje krótki czas reakcji (responsive) Te zasady zostały niedawno sformułowane w „manifeście epoki” – Stanowią swojego rodzaju „koncepcyjny” wzorzec projektowy – Istotą jest uwzględnianie powyższych cech od początku tworzenia aplikacji, na jej wszystkich poziomach
  4. Reactive Programming nie jest czymś nowym. Jest to sposób w jaki aplikacje używają eventów i reagują na nie. Stąd też nazwa. Jest to coś co robiliśmy do tej pory w aplikacjach frontendowych, ustawiając listenery do eventów. Lub w aplikacjach backendowych reagując na zdarzenia z systemu kolejkującego wiadomości (np. Rabbit MQ) coraz więcej działa w chmurze. Klienci korzystają z WebService’u zleca wykonanie pewnych operacji. Zdalne wywołania trwają dłużej niż lokalne metody, więc często zmuszeni jesteśmy wykonywać je w sposób asynchroniczny. Współczesne języki programowania dają nam mechanizmy, które rozwiązują ten problem. Są nimi wywołania asynchroniczne i eventy. Problem pojawia się, gdy chcemy koordynować kilka jednoczesnych wywołań asynchronicznych. Co w sytuacji, gdy jedna z operacji zostanie anulowana, lub wystąpi nieoczekiwany błąd? Kod realizujący taki scenariusz staje się nieczytelny, a co za tym idzie - trudny w utrzymaniu i testowaniu. Wzorzec Obserwatora: Używany jest do powiadamiania zainteresowanych obiektów o zmianie stanu pewnego innego obiektu. Popularyzacja RP dzięki zapotrzebowaniu na dobre narzędzie do implementowania asynchroniczności w rozbudowanych aplikacjach. Powstało wiele implementacji w różnych językach programowania. Manifest RP Cztery reguły RP: Responsive - Aplikacja responsywna ( nie w kontekście dostosowywania rozmiaru, a w kontekście reagowania na akcje użytkownika i komunikowania) Scalable - wiąże się to ze współdzieleniem zasobów oraz danych. Ściśle związana z Responsive. Resilient - elastyczność - zarówno gdy wszystko idzie zgodnie z planem, ale również gdy pojawiąja się problemy (np. Z zewnętrznymi aplikacjami) Message-driven architecture - podstawa aplikacji RP - w przeciwieństwie do programowania imperatywnego, po wywołaniu funkcji nie musimy czekać na odpowiedź wstrzymując system
  5. Spa renderuje się jak aplikacja desktopowa Spa reaguje jak aplikacja desktopowa Spa potrafi informować użytkownika o stanie aplikacji jak aplikacja desktopowa
  6. Krok na przód w kierunku kontrolowania flow Zarządzanie błędami - brak
  7. Event notifications: yes Managed control flow: noooo Brak zwracanej wartości z callbacka
  8. Implementacja stosowana szeroko we współczesnych frameworkach SPA, takich jak AngularJS
  9. Minusy: Reprezentuje tylko pojedyncza wartosc Nie da się anulować Lazy execution
  10. Paradygmat Observable Programowanie reaktywne to rozszerzenie wzorca Obserwatora Observable object represents a push based collection In reactive programming, all data coming in will be in a stream. These streams can be listened to, modified of course (filtered, merged...), and can even become a new stream that can be listened to. This technique allows for fairly decoupled programs: you don’t have to worry much about the consequences of your method call, you just raise an event, and every part of your app interested in this business will react accordingly. And maybe one of these parts will raise an event also, etc...
  11. streams (Node.js), pipes (Unix) or async pipes (Angular 2). Stream jest uporządkowanym zbiorem zdarzeń (eventów) Event reprezentowany jest przez wartości, błędy oraz komunikat zakończenia strumienia. To wszystko pushowane jest od producenta do konsumenta strumienia Stream to OBSERVABLE Listener to OBSERVER Naszym zadaniem jest subskrybcja do strumienia i obsługa tych trzech typów danych
  12. Cała potęga w Rx leży w sposobie implementacji i stosowania. Nie tworzymy funkcji, ktore bezpośrednio konsumują rezultat wywołania, a subskrybujemy wybrany strumień danych. Strumienie są lazy. Dopóki nie ma subskrybcji, strumień jest nieaktywny.
  13. Observable jest w async tym czym generator w sync
  14. http://rxmarbles.com/