[RxJS] ReactiveX javascript
2021년 06월 02일, 21:30
리액티브 프로그래밍
ReactiveX으로 공식 홈페이지에서 표현은
ReactiveX is a combination of the best ideas from the Observer pattern, the Iterator pattern, and functional programming ReactiveX is a library for composing asynchronous and event-based programs by using observable sequences.
옵저버 패턴, 이터레이터 패턴 그리고 함수형 프로그래밍을 조합한 프로그래밍이라고 생각하면 될 것 같다. 그리고,
여기에 비동기적, 이벤트 기반이다.
리액티브 프로그래밍은 비동이 이벤트를 처리하기 위해서 다음과 같은 객체들을 이용해서 처리한다.
- Observable
- Observer
- Subscription
- Operators
- Subject
- Schedulers
Observable
- 비동기 collections
- Observables are lazy Push collections of multiple values.
pull vs push
- pull
- 우리가 일반적으로 아는 코드
- Array 등 iteratable한 객체
const arr = [1,2,3,4,5];
for(let i of arr){
console.log(i);
}
- push
- 비동기
- promise
- observable
const observable = new Observable(subscriber => {
subscriber.next(1);
subscriber.next(2);
subscriber.next(3);
setTimeout(() => {
subscriber.next(4);
subscriber.complete();
}, 1000);
});
Operator
- rxjs에서 많은 유용한 operator
- 순수함수이며 함수형 프로그래밍을 가능하게 해줌
- ex) map, flatmap, switchmap etc..
Subscription
- 보통 Observable.subscribe 후 객체
- 사용 후 버릴 수 있는 객체(직역하면?)
- A Subscription is an object that represents a disposable resource, usually the execution of an Observable.
const observable = interval(1000);
const subscription = observable.subscribe(x => console.log(x));
// Later:
// This cancels the ongoing Observable execution which
// was started by calling subscribe with an Observer.
subscription.unsubscribe();
Subject
-
Observable의 특별한 타입 정도라고 보면 된다.
-
Observable은 unicast(1:1)이지만 subject는 multicast
const subject = new Subject(); subject.subscribe({ next: (v) => console.log(`observerA: ${v}`) }); subject.subscribe({ next: (v) => console.log(`observerB: ${v}`) }); subject.next(1); subject.next(2);
-
subject는 observable, observer
subject.subscribe({ next: (v) => console.log(`observerA: ${v}`) }); subject.subscribe({ next: (v) => console.log(`observerB: ${v}`) }); const observable = from([1, 2, 3]); observable.subscribe(subject);
Scheduler
- 동시성을 제어하는 디스패처
- 연산이 발생하는 시점을 조정 가능
- ex) setTimeout, requestAnimationFrame, micro-task-queue
// Schedules work with setInterval. Use this for time-based operations.
let observable = new Observable((proxyObserver) => {
proxyObserver.next(1);
proxyObserver.next(2);
proxyObserver.next(3);
proxyObserver.complete();
}).pipe(
observeOn(asyncScheduler)
);
let finalObserver = {
next(x) {
console.log('got value ' + x)
},
error(err) {
console.error('something wrong occurred: ' + err);
},
complete() {
console.log('done');
}
};
console.log('just before subscribe');
observable.subscribe(finalObserver);
console.log('just after subscribe');
실행 결과 just before subscribe just after subscribe got value 1 got value 2 got value 3 done