SlideShare a Scribd company logo
1 of 55
Download to read offline
RxJS okiem
do wiadczonego inżyniera
Podczas prelekcji dowiesz się o co chodzi z RxJS, do czego jest ono przydatne
Angularowi. Celem wystąpienia jest zaprezentowanie tworzenia oprogramowania
zgodnie z paradygmatem programowania reaktywnego.
Piotr Kowalski
1 / 55@piecioshka
M wię po chachłacku
2 / 55@piecioshka
"Uzułem się w wygodnie"
3 / 55@piecioshka
"Smędzi mnie i muszę się czego napi "
4 / 55@piecioshka
Asynchroniczno
5 / 55@piecioshka
Asynchroniczno - co my tu mamy....
6 / 55@piecioshka
Asynchroniczno - co my tu mamy....
Callback (ES1)
7 / 55@piecioshka
Asynchroniczno - co my tu mamy....
Callback (ES1)
Promise (ES2015)
8 / 55@piecioshka
Asynchroniczno - co my tu mamy....
Callback (ES1)
Promise (ES2015)
Generators (ES2015)
9 / 55@piecioshka
Asynchroniczno - co my tu mamy....
Callback (ES1)
Promise (ES2015)
Generators (ES2015)
async / await (ES2017)
10 / 55@piecioshka
Asynchroniczno - co my tu mamy....
Callback (ES1)
Promise (ES2015)
Generators (ES2015)
async / await (ES2017)
Observable (Stage 1) ✨
11 / 55@piecioshka
Callback (ES1)
const callback = () => {
// ...
};
const delay = 1234;
setTimeout(callback, delay);
12 / 55@piecioshka
Promise (ES2015)
const URL = '//jsonplaceholder.typicode.com/posts';
function request(url) {
return fetch(url).then(res => res.json());
}
request(URL)
.then((photos) => {
console.log(photos);
});
13 / 55@piecioshka
Generators (ES2015)
const URL = '//jsonplaceholder.typicode.com/posts';
function request(url) {
return fetch(url).then(res => res.text())
.then(res => program.next(res)); // WTF?
}
function * main() {
let response = yield request(URL);
console.log('response', JSON.parse(response));
}
const program = main(); // WTF?
program.next(); // WTF?
14 / 55@piecioshka
Generators (ES2015) - wyeliminowane WTF-y
const URL1 = '//jsonplaceholder.typicode.com/posts';
const URL2 = '//jsonplaceholder.typicode.com/photos';
function request(url) {
return fetch(url).then(res => res.text())
}
function * main() {
let response1 = yield request(URL1);
console.log('posts', JSON.parse(response1));
let response2 = yield request(URL2);
console.log('photos', JSON.parse(response2));
}
function runGenerator(generatorConstructor) {
let generator = generatorConstructor();
(function next(data) {
let step = generator.next(data);
if (step.done) return;
step.value.then(next);
})(null);
}
runGenerator(main);
15 / 55@piecioshka
async / await (ES2017)
const URL1 = '//jsonplaceholder.typicode.com/posts';
const URL2 = '//jsonplaceholder.typicode.com/photos';
async function request(url) {
const response = await fetch(url);
return await response.json();
}
async function main() {
const posts = await request(URL1);
console.log('posts', posts);
const photos = await request(URL2);
console.log('photos', photos);
}
main();
16 / 55@piecioshka
Observable (Stage 1) ✨
const URL = '//jsonplaceholder.typicode.com/posts';
function request(url, observer) {
fetch(url)
.then(res => res.json())
.then(res => observer.next(res))
.catch(err => observer.error(err))
.then(() => observer.complete());
}
Rx.Observable // WARNING: vendor
.create(obs => request(URL, obs))
.subscribe(
console.log.bind(console, 'success'),
console.log.bind(console, 'error'),
console.log.bind(console, 'complete')
);
17 / 55@piecioshka
Wzorce projektowe
18 / 55@piecioshka
Wzorzec Observer
19 / 55@piecioshka
Wzorzec Observer
Software Design Pattern
20 / 55@piecioshka
Wzorzec Observer
Software Design Pattern
Podmioty: Subject, Observers
21 / 55@piecioshka
Wzorzec Observer : Przykład
// Observer pattern
const subject = document;
const observer = () => {
console.log('from observer');
};
subject.addEventListener('click', observer);
22 / 55@piecioshka
Biblioteki?
npm/backbone (Backbone.Events)
npm/event-emitter
npm/super-event-emitter
oraz następujące, kt rych nie sprawdzałem:
npm/eventemitter2
npm/eventemitter3
npm/sparkles
Dlaczego napisałem swoją wersję?
23 / 55@piecioshka
Wzorzec PubSub
24 / 55@piecioshka
Wzorzec PubSub
Messaging Pattern
25 / 55@piecioshka
Wzorzec PubSub
Messaging Pattern
Podmioty: Publisher, Subscribers
26 / 55@piecioshka
Wzorzec PubSub : Przykład
// Publish-subscribe pattern
class DOMPublisher {
constructor($element, eventName = 'mousemove') {
this.subscribers = [];
$element.addEventListener(eventName, (evt) => this.publish(evt));
}
publish(data) {
this.subscribers.forEach(item => item(data));
}
subscribe(fn) {
this.subscribers.push(fn);
}
}
const publisher = new DOMPublisher(document, 'click');
const subscriber = () => {
console.log('from subscriber');
};
publisher.subscribe(subscriber);
27 / 55@piecioshka
R żnice?
28 / 55@piecioshka
RxJS
29 / 55@piecioshka
Observable vs Subject
30 / 55@piecioshka
31 / 55@piecioshka
32 / 55@piecioshka
33 / 55@piecioshka
34 / 55@piecioshka
35 / 55@piecioshka
36 / 55@piecioshka
37 / 55@piecioshka
https://www.meetup.com/Angular-
Warsaw/events/242530230/
38 / 55@piecioshka
Pytania z Meetup.com
1. ⛔  Dlaczego zesp ł Angulara zdecydował się na wprowadzenie RxJS, jako jednego z gł wnych graczy tego
frameworka?
2. ✅  Czy można dobrze korzysta z Angulara bez znajomo ci RxJS?
3. ✅  Top 10 funkcji RxJS niezbędnych do poznania na start.
4. ⛔  Jakie są przypadki użycia tej biblioteki?
5. ✅  Czy w przypadku pojedynczego wywołania REST-owego API serwera (w odniesieniu do Angulara)
zwracającego prostego JSON-a, lepiej skorzysta z obiektu Observable czy zamieni to na
Promise , jaką korzy daje nam Observable w tym przypadku?
6. ⛔  Ile czasu zajęło Ci / Twojemu zespołowi opanowanie RxJS na poziomie niezbędnym do swobodnej
pracy?
7. ⛔  W jakich przypadkach polecasz używanie RxJS - czy w każdym projekcie ma to sens?
8. ⛔  Jak poprawnie testowa logikę aplikacji opartej na RxJS?
39 / 55@piecioshka
Pytanie 1
Czy można dobrze
korzysta z Angulara bez
znajomo ci RxJS?
40 / 55@piecioshka
Pytanie 1 Czy można dobrze korzysta z
Angulara bez znajomo ci RxJS?
41 / 55@piecioshka
Pytanie 1 Czy można dobrze korzysta z
Angulara bez znajomo ci RxJS?
Router, Forms, Komunikacja z serwerem.
42 / 55@piecioshka
Pytanie 1 Czy można dobrze korzysta z
Angulara bez znajomo ci RxJS?
Router, Forms, Komunikacja z serwerem.
Łatwe?
43 / 55@piecioshka
Pytanie 1 Czy można dobrze korzysta z
Angulara bez znajomo ci RxJS?
Router, Forms, Komunikacja z serwerem.
Łatwe?
A co z Race Condition
44 / 55@piecioshka
Race Condition : Rozwiązanie
switchMap albo unsubscribe
Zobacz: github.com/piecioshka/angular-
rxjs-race-condition-problem
45 / 55@piecioshka
Pytanie 2
Top 10 funkcji RxJS
niezbędnych do poznania
na start.
46 / 55@piecioshka
Pytanie 2 Top 10 funkcji RxJS na start
1. rxjs/observable/from
2. rxjs/observable/fromEvent
3. rxjs/observable/create
4. rxjs/observable/combineLatest
5. rxjs/operator/do
6. rxjs/operator/concat
7. rxjs/operator/map
8. rxjs/operator/filter
9. rxjs/operator/concatMap
10. rxjs/operator/finally
47 / 55@piecioshka
Pytanie 3
Czy w przypadku pojedynczego wywołania REST-
owego API serwera (w odniesieniu do Angulara)
zwracającego prostego JSON-a, lepiej skorzysta
z obiektu Observable czy zamieni to na
Promise , jaką korzy daje nam
Observable w tym przypadku?
48 / 55@piecioshka
Pytanie 3 Czy zamieniłby Observable w
Promise dla zapyta HTTP?
Nie.
Polimorfizm
Operator retry
49 / 55@piecioshka
Hint 1
Obsługa błęd w HTTP?
50 / 55@piecioshka
Hint 1 Obsługa błęd w HTTP?
@Injectable()
export class HttpInterceptor extends Http {
constructor(
backend: XHRBackend,
options: RequestOptions,
public http: Http,
) {
super(backend, options)
}
public request(url: string|Request, options?: RequestOptionsArgs): Observable<Response> {
return super.request(url, options)
.catch(this.handleError)
}
public handleError = (error: Response) => {
// Do messaging and error handling here
// - inform error collector
// - display message to user
return Observable.throw(response.message)
}
}
51 / 55@piecioshka
Hint 2
Debugging
52 / 55@piecioshka
Hint 2 Debugging z użyciem rxjs-spy
import { spy } from 'rxjs-spy';
import 'rxjs-spy/add/operator/tag';
// ...
fetchSomething() {
return this.http.get(url)
.tag('downloading completed')
}
// ...
// in DevTools type:
rxSpy.show();
53 / 55@piecioshka
Thanks
54 / 55@piecioshka
Thanks
20 min
55 / 55@piecioshka

More Related Content

Similar to RxJS okiem doświadczonego inżyniera - Angular Warsaw #13

tRPC - czy to koniec GraphQL?
tRPC - czy to koniec GraphQL?tRPC - czy to koniec GraphQL?
tRPC - czy to koniec GraphQL?Brainhub
 
Laravel Octane - czy na pewno taki szybki?
Laravel Octane - czy na pewno taki szybki?Laravel Octane - czy na pewno taki szybki?
Laravel Octane - czy na pewno taki szybki?Laravel Poland MeetUp
 
Confitura 2015 - Code Quality Keepers @ Allegro
Confitura 2015 - Code Quality Keepers @ AllegroConfitura 2015 - Code Quality Keepers @ Allegro
Confitura 2015 - Code Quality Keepers @ Allegroallegro.tech
 
Mvc frontend-trug-02-2011
Mvc frontend-trug-02-2011Mvc frontend-trug-02-2011
Mvc frontend-trug-02-2011Rafal Piekarski
 
e2e frameworks - czyli kij ma dwa końce
e2e frameworks - czyli kij ma dwa końcee2e frameworks - czyli kij ma dwa końce
e2e frameworks - czyli kij ma dwa końceThe Software House
 
Reactive programming
Reactive programmingReactive programming
Reactive programmingSunscrapers
 
Produkcja aplikacji internetowych
Produkcja aplikacji internetowychProdukcja aplikacji internetowych
Produkcja aplikacji internetowychTomasz Borowski
 
Programowanie Komponentowe: #1 Wprowadzenie
Programowanie Komponentowe: #1 WprowadzenieProgramowanie Komponentowe: #1 Wprowadzenie
Programowanie Komponentowe: #1 WprowadzenieMikołaj Olszewski
 
Extjs & netzke
Extjs & netzkeExtjs & netzke
Extjs & netzkeGaldoMedia
 
Jak nadążyć za światem front-endu - WordPress Training Day
Jak nadążyć za światem front-endu - WordPress Training DayJak nadążyć za światem front-endu - WordPress Training Day
Jak nadążyć za światem front-endu - WordPress Training DayTomasz Dziuda
 
Integracja JSF + Facelets + Spring + JPA + Tomahawk
Integracja JSF + Facelets + Spring + JPA + TomahawkIntegracja JSF + Facelets + Spring + JPA + Tomahawk
Integracja JSF + Facelets + Spring + JPA + TomahawkWiktor Gworek
 
HYC - Angular stań się kanciastym
HYC - Angular stań się kanciastymHYC - Angular stań się kanciastym
HYC - Angular stań się kanciastymDariusz Jagieło
 
Co nowego w ASP.NET MVC 4?
Co nowego w ASP.NET MVC 4?Co nowego w ASP.NET MVC 4?
Co nowego w ASP.NET MVC 4?tkryskiewicz
 
Wzorce Repository, Unity of Work, Devexpress MVC w architekturze Asp.net MVC
Wzorce Repository, Unity of Work, Devexpress MVC  w architekturze Asp.net MVCWzorce Repository, Unity of Work, Devexpress MVC  w architekturze Asp.net MVC
Wzorce Repository, Unity of Work, Devexpress MVC w architekturze Asp.net MVCQuick-Solution
 
[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 allegroallegro.tech
 
Nowości w Javie 8 okiem programisty
Nowości w Javie 8 okiem programistyNowości w Javie 8 okiem programisty
Nowości w Javie 8 okiem programistyMarcinStachniuk
 
Asynchroniczne testy JavaScript aplikacji webowych
Asynchroniczne testy JavaScript aplikacji webowychAsynchroniczne testy JavaScript aplikacji webowych
Asynchroniczne testy JavaScript aplikacji webowychFuture Processing
 
Programowanie Równolegle - Parallel Extensions
Programowanie Równolegle - Parallel ExtensionsProgramowanie Równolegle - Parallel Extensions
Programowanie Równolegle - Parallel ExtensionsWojciech Grześkowiak
 

Similar to RxJS okiem doświadczonego inżyniera - Angular Warsaw #13 (20)

tRPC - czy to koniec GraphQL?
tRPC - czy to koniec GraphQL?tRPC - czy to koniec GraphQL?
tRPC - czy to koniec GraphQL?
 
JavaScript, Moduły
JavaScript, ModułyJavaScript, Moduły
JavaScript, Moduły
 
Laravel Octane - czy na pewno taki szybki?
Laravel Octane - czy na pewno taki szybki?Laravel Octane - czy na pewno taki szybki?
Laravel Octane - czy na pewno taki szybki?
 
Confitura 2015 - Code Quality Keepers @ Allegro
Confitura 2015 - Code Quality Keepers @ AllegroConfitura 2015 - Code Quality Keepers @ Allegro
Confitura 2015 - Code Quality Keepers @ Allegro
 
university day 1
university day 1university day 1
university day 1
 
Mvc frontend-trug-02-2011
Mvc frontend-trug-02-2011Mvc frontend-trug-02-2011
Mvc frontend-trug-02-2011
 
e2e frameworks - czyli kij ma dwa końce
e2e frameworks - czyli kij ma dwa końcee2e frameworks - czyli kij ma dwa końce
e2e frameworks - czyli kij ma dwa końce
 
Reactive programming
Reactive programmingReactive programming
Reactive programming
 
Produkcja aplikacji internetowych
Produkcja aplikacji internetowychProdukcja aplikacji internetowych
Produkcja aplikacji internetowych
 
Programowanie Komponentowe: #1 Wprowadzenie
Programowanie Komponentowe: #1 WprowadzenieProgramowanie Komponentowe: #1 Wprowadzenie
Programowanie Komponentowe: #1 Wprowadzenie
 
Extjs & netzke
Extjs & netzkeExtjs & netzke
Extjs & netzke
 
Jak nadążyć za światem front-endu - WordPress Training Day
Jak nadążyć za światem front-endu - WordPress Training DayJak nadążyć za światem front-endu - WordPress Training Day
Jak nadążyć za światem front-endu - WordPress Training Day
 
Integracja JSF + Facelets + Spring + JPA + Tomahawk
Integracja JSF + Facelets + Spring + JPA + TomahawkIntegracja JSF + Facelets + Spring + JPA + Tomahawk
Integracja JSF + Facelets + Spring + JPA + Tomahawk
 
HYC - Angular stań się kanciastym
HYC - Angular stań się kanciastymHYC - Angular stań się kanciastym
HYC - Angular stań się kanciastym
 
Co nowego w ASP.NET MVC 4?
Co nowego w ASP.NET MVC 4?Co nowego w ASP.NET MVC 4?
Co nowego w ASP.NET MVC 4?
 
Wzorce Repository, Unity of Work, Devexpress MVC w architekturze Asp.net MVC
Wzorce Repository, Unity of Work, Devexpress MVC  w architekturze Asp.net MVCWzorce Repository, Unity of Work, Devexpress MVC  w architekturze Asp.net MVC
Wzorce Repository, Unity of Work, Devexpress MVC w architekturze Asp.net MVC
 
[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
 
Nowości w Javie 8 okiem programisty
Nowości w Javie 8 okiem programistyNowości w Javie 8 okiem programisty
Nowości w Javie 8 okiem programisty
 
Asynchroniczne testy JavaScript aplikacji webowych
Asynchroniczne testy JavaScript aplikacji webowychAsynchroniczne testy JavaScript aplikacji webowych
Asynchroniczne testy JavaScript aplikacji webowych
 
Programowanie Równolegle - Parallel Extensions
Programowanie Równolegle - Parallel ExtensionsProgramowanie Równolegle - Parallel Extensions
Programowanie Równolegle - Parallel Extensions
 

RxJS okiem doświadczonego inżyniera - Angular Warsaw #13

  • 1. RxJS okiem do wiadczonego inżyniera Podczas prelekcji dowiesz się o co chodzi z RxJS, do czego jest ono przydatne Angularowi. Celem wystąpienia jest zaprezentowanie tworzenia oprogramowania zgodnie z paradygmatem programowania reaktywnego. Piotr Kowalski 1 / 55@piecioshka
  • 2. M wię po chachłacku 2 / 55@piecioshka
  • 3. "Uzułem się w wygodnie" 3 / 55@piecioshka
  • 4. "Smędzi mnie i muszę się czego napi " 4 / 55@piecioshka
  • 6. Asynchroniczno - co my tu mamy.... 6 / 55@piecioshka
  • 7. Asynchroniczno - co my tu mamy.... Callback (ES1) 7 / 55@piecioshka
  • 8. Asynchroniczno - co my tu mamy.... Callback (ES1) Promise (ES2015) 8 / 55@piecioshka
  • 9. Asynchroniczno - co my tu mamy.... Callback (ES1) Promise (ES2015) Generators (ES2015) 9 / 55@piecioshka
  • 10. Asynchroniczno - co my tu mamy.... Callback (ES1) Promise (ES2015) Generators (ES2015) async / await (ES2017) 10 / 55@piecioshka
  • 11. Asynchroniczno - co my tu mamy.... Callback (ES1) Promise (ES2015) Generators (ES2015) async / await (ES2017) Observable (Stage 1) ✨ 11 / 55@piecioshka
  • 12. Callback (ES1) const callback = () => { // ... }; const delay = 1234; setTimeout(callback, delay); 12 / 55@piecioshka
  • 13. Promise (ES2015) const URL = '//jsonplaceholder.typicode.com/posts'; function request(url) { return fetch(url).then(res => res.json()); } request(URL) .then((photos) => { console.log(photos); }); 13 / 55@piecioshka
  • 14. Generators (ES2015) const URL = '//jsonplaceholder.typicode.com/posts'; function request(url) { return fetch(url).then(res => res.text()) .then(res => program.next(res)); // WTF? } function * main() { let response = yield request(URL); console.log('response', JSON.parse(response)); } const program = main(); // WTF? program.next(); // WTF? 14 / 55@piecioshka
  • 15. Generators (ES2015) - wyeliminowane WTF-y const URL1 = '//jsonplaceholder.typicode.com/posts'; const URL2 = '//jsonplaceholder.typicode.com/photos'; function request(url) { return fetch(url).then(res => res.text()) } function * main() { let response1 = yield request(URL1); console.log('posts', JSON.parse(response1)); let response2 = yield request(URL2); console.log('photos', JSON.parse(response2)); } function runGenerator(generatorConstructor) { let generator = generatorConstructor(); (function next(data) { let step = generator.next(data); if (step.done) return; step.value.then(next); })(null); } runGenerator(main); 15 / 55@piecioshka
  • 16. async / await (ES2017) const URL1 = '//jsonplaceholder.typicode.com/posts'; const URL2 = '//jsonplaceholder.typicode.com/photos'; async function request(url) { const response = await fetch(url); return await response.json(); } async function main() { const posts = await request(URL1); console.log('posts', posts); const photos = await request(URL2); console.log('photos', photos); } main(); 16 / 55@piecioshka
  • 17. Observable (Stage 1) ✨ const URL = '//jsonplaceholder.typicode.com/posts'; function request(url, observer) { fetch(url) .then(res => res.json()) .then(res => observer.next(res)) .catch(err => observer.error(err)) .then(() => observer.complete()); } Rx.Observable // WARNING: vendor .create(obs => request(URL, obs)) .subscribe( console.log.bind(console, 'success'), console.log.bind(console, 'error'), console.log.bind(console, 'complete') ); 17 / 55@piecioshka
  • 18. Wzorce projektowe 18 / 55@piecioshka
  • 19. Wzorzec Observer 19 / 55@piecioshka
  • 20. Wzorzec Observer Software Design Pattern 20 / 55@piecioshka
  • 21. Wzorzec Observer Software Design Pattern Podmioty: Subject, Observers 21 / 55@piecioshka
  • 22. Wzorzec Observer : Przykład // Observer pattern const subject = document; const observer = () => { console.log('from observer'); }; subject.addEventListener('click', observer); 22 / 55@piecioshka
  • 23. Biblioteki? npm/backbone (Backbone.Events) npm/event-emitter npm/super-event-emitter oraz następujące, kt rych nie sprawdzałem: npm/eventemitter2 npm/eventemitter3 npm/sparkles Dlaczego napisałem swoją wersję? 23 / 55@piecioshka
  • 24. Wzorzec PubSub 24 / 55@piecioshka
  • 26. Wzorzec PubSub Messaging Pattern Podmioty: Publisher, Subscribers 26 / 55@piecioshka
  • 27. Wzorzec PubSub : Przykład // Publish-subscribe pattern class DOMPublisher { constructor($element, eventName = 'mousemove') { this.subscribers = []; $element.addEventListener(eventName, (evt) => this.publish(evt)); } publish(data) { this.subscribers.forEach(item => item(data)); } subscribe(fn) { this.subscribers.push(fn); } } const publisher = new DOMPublisher(document, 'click'); const subscriber = () => { console.log('from subscriber'); }; publisher.subscribe(subscriber); 27 / 55@piecioshka
  • 28. R żnice? 28 / 55@piecioshka
  • 30. Observable vs Subject 30 / 55@piecioshka
  • 39. Pytania z Meetup.com 1. ⛔  Dlaczego zesp ł Angulara zdecydował się na wprowadzenie RxJS, jako jednego z gł wnych graczy tego frameworka? 2. ✅  Czy można dobrze korzysta z Angulara bez znajomo ci RxJS? 3. ✅  Top 10 funkcji RxJS niezbędnych do poznania na start. 4. ⛔  Jakie są przypadki użycia tej biblioteki? 5. ✅  Czy w przypadku pojedynczego wywołania REST-owego API serwera (w odniesieniu do Angulara) zwracającego prostego JSON-a, lepiej skorzysta z obiektu Observable czy zamieni to na Promise , jaką korzy daje nam Observable w tym przypadku? 6. ⛔  Ile czasu zajęło Ci / Twojemu zespołowi opanowanie RxJS na poziomie niezbędnym do swobodnej pracy? 7. ⛔  W jakich przypadkach polecasz używanie RxJS - czy w każdym projekcie ma to sens? 8. ⛔  Jak poprawnie testowa logikę aplikacji opartej na RxJS? 39 / 55@piecioshka
  • 40. Pytanie 1 Czy można dobrze korzysta z Angulara bez znajomo ci RxJS? 40 / 55@piecioshka
  • 41. Pytanie 1 Czy można dobrze korzysta z Angulara bez znajomo ci RxJS? 41 / 55@piecioshka
  • 42. Pytanie 1 Czy można dobrze korzysta z Angulara bez znajomo ci RxJS? Router, Forms, Komunikacja z serwerem. 42 / 55@piecioshka
  • 43. Pytanie 1 Czy można dobrze korzysta z Angulara bez znajomo ci RxJS? Router, Forms, Komunikacja z serwerem. Łatwe? 43 / 55@piecioshka
  • 44. Pytanie 1 Czy można dobrze korzysta z Angulara bez znajomo ci RxJS? Router, Forms, Komunikacja z serwerem. Łatwe? A co z Race Condition 44 / 55@piecioshka
  • 45. Race Condition : Rozwiązanie switchMap albo unsubscribe Zobacz: github.com/piecioshka/angular- rxjs-race-condition-problem 45 / 55@piecioshka
  • 46. Pytanie 2 Top 10 funkcji RxJS niezbędnych do poznania na start. 46 / 55@piecioshka
  • 47. Pytanie 2 Top 10 funkcji RxJS na start 1. rxjs/observable/from 2. rxjs/observable/fromEvent 3. rxjs/observable/create 4. rxjs/observable/combineLatest 5. rxjs/operator/do 6. rxjs/operator/concat 7. rxjs/operator/map 8. rxjs/operator/filter 9. rxjs/operator/concatMap 10. rxjs/operator/finally 47 / 55@piecioshka
  • 48. Pytanie 3 Czy w przypadku pojedynczego wywołania REST- owego API serwera (w odniesieniu do Angulara) zwracającego prostego JSON-a, lepiej skorzysta z obiektu Observable czy zamieni to na Promise , jaką korzy daje nam Observable w tym przypadku? 48 / 55@piecioshka
  • 49. Pytanie 3 Czy zamieniłby Observable w Promise dla zapyta HTTP? Nie. Polimorfizm Operator retry 49 / 55@piecioshka
  • 50. Hint 1 Obsługa błęd w HTTP? 50 / 55@piecioshka
  • 51. Hint 1 Obsługa błęd w HTTP? @Injectable() export class HttpInterceptor extends Http { constructor( backend: XHRBackend, options: RequestOptions, public http: Http, ) { super(backend, options) } public request(url: string|Request, options?: RequestOptionsArgs): Observable<Response> { return super.request(url, options) .catch(this.handleError) } public handleError = (error: Response) => { // Do messaging and error handling here // - inform error collector // - display message to user return Observable.throw(response.message) } } 51 / 55@piecioshka
  • 52. Hint 2 Debugging 52 / 55@piecioshka
  • 53. Hint 2 Debugging z użyciem rxjs-spy import { spy } from 'rxjs-spy'; import 'rxjs-spy/add/operator/tag'; // ... fetchSomething() { return this.http.get(url) .tag('downloading completed') } // ... // in DevTools type: rxSpy.show(); 53 / 55@piecioshka
  • 55. Thanks 20 min 55 / 55@piecioshka