Reactive Extensions for JavaScript
A toolbox for creating and handling reactive data streams
Image source: https://flic.kr/p/c4QJzC
Image source: http://popkey.co/m/aWG7m-matrix
a visual representation of data streams & transformations
Image source: https://flic.kr/p/k97UbB
onNext* (onCompleted|onError)?
Image source: https://flic.kr/p/esT1Qa
import { Observable } from 'rx';
// Contract: Observer needs to implement the following methods
// `onNext`, `onCompleted` and `onError`.
const source = Observable.create((observer) => {
// Yield a single value and complete
observer.next(42);
observer.complete();
// Any cleanup logic might go here.
return () => {
console.log('unsubscribed');
}
});
const subscription = source.subscribe(
(x) => { console.log('next: %s', x); },
(e) => { console.log('error: %s', e); },
() => { console.log('complete'); });
// => next: 42
// => complete
subscription.unsubscribe(); // => unsubscribed
Image source: https://flic.kr/p/esT1Qa
import { Subscriber } from 'rxjs/Subscriber';
const subscriber = Subscriber.create(
function next(x) {
console.log('Next: %s', x);
},
function error(err) {
console.log('Error: %s', err);
},
function complete() {
console.log('Completed');
}
);
// Usage
Observable
.interval(1000)
.take(3)
.subscribe(subscriber);
Image source: https://flic.kr/p/esT1Qa
import { Observable, Subject } from 'rx';
// Emit a value every second.
const source = Observable.interval(1000);
const subject = new Subject();
const subSource = source.subscribe(subject);
const subSubject1 = subject.subscribe(
(x) => { console.log('Value published to observer #1: ' + x); },
(e) => { console.log('onError: ' + e.message); },
() => { console.log('onCompleted'); });
const subSubject2 = subject.subscribe(
(x) => { console.log('Value published to observer #2: ' + x); },
(e) => { console.log('onError: ' + e.message); },
() => { console.log('onCompleted'); });
setTimeout(function () {
// Clean up
subject.onCompleted();
subSubject1.dispose();
subSubject2.dispose();
}, 5000);
// Value published to observer #1: 0
// Value published to observer #2: 0
// Value published to observer #1: 1
// Value published to observer #2: 1
// Value published to observer #1: 2
// Value published to observer #2: 2
// Value published to observer #1: 3
// Value published to observer #2: 3
// onCompleted
// onCompleted
Image source: https://flic.kr/p/esT1Qa
Image source: https://flic.kr/p/esT1Qa
Image source: https://flic.kr/p/biWKFi
Analogy: (Live) Band performance
Image source: https://flic.kr/p/q6jVxA
Image source: https://flic.kr/p/q6jVxA
Image source: https://flic.kr/p/4YphW4
import { Observable } from 'rx';
const source = Observable.of('RxJs', 'is', 'awesome');
const subscription = source.subscribe(
(x) => console.log(x),
(e) => console.error(e),
() => console.log('completed')
);
// RxJs
// is
// awesome
// completed
import { Observable } from 'rx';
const source = Observable.interval(1000)
.timestamp() // add current timestamp
.take(3); // take only the first three items of the Observable
const subscription = source.subscribe(
(x) => console.log(x),
(e) => console.error(e),
() => console.log('completed')
);
// Object {value: 0, timestamp: 1463409084511}
// Object {value: 1, timestamp: 1463409085512}
// Object {value: 2, timestamp: 1463409086513}
// completed
import { Observable } from 'rx';
const promiseFn = () => {
return new Promise((resolve, reject) => {
console.log('Promise started');
setTimeout(() => {
console.log('Promise resolved');
resolve(42);
}, 1000);
console.log('Promise in flight');
});
};
const source = Observable.fromPromise(promiseFn);
const subscription = source.subscribe(
(x) => console.log(x),
(e) => console.error(e),
() => console.log('completed')
);
// Promise started
// Promise in flight
// Promise resolved
// 42
// completed
import { Observable } from 'rx';
const source = Observable.fromEvent(document, 'mousemove')
.map(event => `Cursor at: ${event.clientX}, ${event.clientY}`)
.first(5);
const subscription = source.subscribe(
(x) => console.log(x),
(e) => console.error(e),
() => console.log('completed')
);
// Cursor at: 20, 170
// Cursor at: 53, 156
// Cursor at: 82, 146
// Cursor at: 111, 135
// Cursor at: 125, 131
// completed
Task:
Task:
Task:
Task: