
RxJS it's a"Lodash for async" - Ben Lesh

ReactiveX
What is Reactive Library ?
Responsive - applications should respond quickly
Resilient - do not fall in case of errors
Elastic - be flexible in terms of increasing / decreasing capacity
Message Driven - based on asynchronous events

ReactiveX
What is Observable, Observer & Observers ?
Observable (наблюдаемый)
- contains list of observers
- should implements an interface subscribe, unsubscribe, notification to its observers when its state changes.
Observers (наблюдатели)
- has a function signature that can be invoked when Subject changes


ReactiveX
Observer Design Pattern Example
class Observable {
constructor() {
this.observers = [];
}
subscribe(observer) {
this.observers.push(observer);
}
unsubscribe(observer) {
this.observers = this.observers.filter((o) => o !== observer);
}
notify(data) {
this.observers.forEach((o) => o.call(this, data));
}
}
const observable = new Observable();
function log(value) {
console.log(value);
}
observable.subscribe(log);
observable.notify('notify some msg');
observable.notify({msg: 'notify some obj'});
observable.unsubscribe(log);
observable.notify('some msg should display');

ReactiveX


ReactiveX
RxJS Observable (handmade)
class Observable {
constructor(observer) {
this.observer = observer;
}
map(cb) {
this.observer = this.observer.map(cb);
return this;
}
filter(predicate) {
this.observer = this.observer.filter(predicate);
return this;
}
subscribe(next) {
return next(this.observer);
}
}
new Observable('Observable'.split(''))
.map((letter) => letter.toUpperCase())
.filter((letter) => letter === 'S')
.subscribe(console.log);

ReactiveX
Rx.Observable.from('Observable')
.map((letter) => letter.toUpperCase())
.filter((letter) => letter === 'S')
.subscribe(console.log);RxJS Observable (using RxJS)
new Observable('Observable'.split(''))
.map((letter) => letter.toUpperCase())
.filter((letter) => letter === 'S')
.subscribe(console.log);(handmade)
(RxJS)

ReactiveX
RxJS install
// Just the core RxJS
<script src="rx.js"></script>
// Or all of RxJS minus testing
<script src="rx.all.js"></script>
// Or keeping it lite
<script src="rx.lite.js"></script>// installing with NPM
npm install rx1. go to RxJS site
2. choose you platform

ReactiveX
Cheers!
you know RxJS what is next step ?

ReactiveX
Observable Operators


ReactiveX

marble diagrams, what is stream & why is conveniently ?

ReactiveX
const $incrementBtn = document.querySelector('#plus');
const $decrementBtn = document.querySelector('#minus');
const $result = document.querySelector('#result');
const incrementStream = Rx.Observable.fromEvent($incrementBtn, 'click');
const decrementStream = Rx.Observable.fromEvent($decrementBtn, 'click');
const plus = incrementStream.map(1);
const minus = decrementStream.map(-1);
const initialValue = 0;
const source = plus.merge(minus);
source
.scan((acc, v) => acc + v, initialValue)
.subscribe((v) => {
$result.innerHTML = v;
});
fromEvent

ReactiveX
const promiseResolve = Promise.resolve({ data: 'some data' });
const promiseReject = Promise.reject(new Error('error reason'));
const streamSuccess = Rx.Observable.fromPromise(promiseResolve);
const streamError = Rx.Observable.fromPromise(promiseReject);
streamSuccess.subscribe(
(d) => { console.log('Resolve ', d); },
(err) => {console.log('Reject ', err);},
() => {console.log('Completed');}
);
streamError.subscribe(
(d) => { console.log('Resolve ', d); },
(err) => {console.log('Reject ', err);},
() => {console.log('Completed');}
);
fromPromise

ReactiveX
Subject
const subject = new Rx.Subject();
const subscription = subject.subscribe(
(x)=> { console.log('onNext: ' + x); },
(e)=> { console.log('onError: ' + e.message); },
() => { console.log('onCompleted'); }
);
subject.onNext(1);
// => onNext: 1
subject.onNext(2);
// => onNext: 2
subject.onCompleted();
// => onCompleted
subscription.dispose();
ReactiveX
BehaviorSubject
const subject = new Rx.BehaviorSubject(0);
const subscription = subject.subscribe(
(x)=> { console.log('onNext: ' + x); },
(e)=> { console.log('onError: ' + e.message); },
() => { console.log('onCompleted'); }
);
// => onNext: 0
subject.onNext(1);
// => onNext: 1
subject.onNext(2);
// => onNext: 2
subject.onCompleted();
// => onCompleted
subscription.dispose();
ReactiveX
Where I can use it ?
Component login
Component user info
Auth Service
subscribe
next
1
2
3
1
3

ReactiveX
Implementation
const authService = new Rx.BehaviorSubject({ userInfo: {}, isAuth: false });
const loginComponent = authService.subscribe(({ isAuth })=> {
console.log('Login Component, isAuth: ', isAuth);
});
const userInfoComponent = authService.subscribe(({ isAuth })=> {
console.log('User Info Component, isAuth: ', isAuth);
});
authService.onNext({ userInfo: { username: 'sarhan' }, isAuth: true });
// Will be display after change route
const OtherComponent = authService.subscribe(({ isAuth })=> {
console.log('Other Component, isAuth: ', isAuth);
});
ReactiveX
Questions ?
RxJS
By Sarhan Azizov
RxJS
- 434