Angular

Angular - RxJS 란?

인어공쭈 2023. 3. 29. 10:51

개념

RxJS는 Observables을 사용한 반응형 프로그래밍을 위한 라이브러리이다. 

이는 이벤트 처리와 데이터 스트림 관리를 위해 특히 비동기 프로그래밍에 널리 사용되는 JavaScript 라이브러리이다

 

비교

일반적인 자바스크립트 코드와의 비교

 

1) 자바스크립트

let count = 0;
let rate = 1000;
let lastClick = Date.now() - rate;
document.addEventListener('click', () => {
  if (Date.now() - lastClick >= rate) {
    console.log(`Clicked ${++count} times`);
    lastClick = Date.now();
  }
});

 

2) RxJS 사용 - 다양한 제어 연산자들은 이벤트 제어에 도움이됌 (제어 연산자 : filter , delay , debounceTime , 등)

import { fromEvent, throttleTime, scan } from 'rxjs';

fromEvent(document, 'click')
  .pipe(
    throttleTime(1000),
    scan((count) => count + 1, 0)
  )
  .subscribe((count) => console.log(`Clicked ${count} times`));

 이외에도 다양한 연산자는 아래를 참조

https://rxjs.dev/guide/operators

 

RxJS

 

rxjs.dev

 

특징

1. Observable

- 값 또는 이벤트의 호출 가능한 아이디어를 나타냄

- 일반적으로 subscribe() 메서드를 호출하여 관찰을 시작하고, next(), error(), complete() 메서드를 사용하여 데이터를 전달하고, 에러 및 완료를 처리한다. 이러한 메서드를 통해 데이터 스트림에서 발생하는 이벤트를 처리할 수 있다.

import { Observable } from 'rxjs';

const observable = new Observable((subscriber) => {
  subscriber.next(1);
  subscriber.next(2);
  subscriber.next(3);
  setTimeout(() => {
    subscriber.next(4);
    subscriber.complete();
  }, 1000);
});

console.log('just before subscribe');
observable.subscribe({
  next(x) {
    console.log('got value ' + x);
  },
  error(err) {
    console.error('something wrong occurred: ' + err);
  },
  complete() {
    console.log('done');
  },
});
console.log('just after subscribe');

2. Observer

- Observable이 전달한 값을 수신하는 방법을 알고 있는 콜백 모음

- Observable이 전달할 수 있는 각 알림 유형에 대해 하나씩 세 개의 콜백이 있는 객체

- Observable은 데이터 스트림을 발생시키는 제공자(provider)이고, Observer는 데이터 스트림을 사용하는 소비자(consumer)이다. Observable은 데이터를 발행(publish)하고, Observer는 데이터를 구독(subscribe)한다.

 

3. Subscription

- Observable의 실행을 나타냄, 기본적으로 unsubscribe()리소스를 해제하거나 Observable 실행을 취소하는 기능만 있음

import { interval } from 'rxjs';

const observable1 = interval(400);
const observable2 = interval(300);

const subscription = observable1.subscribe(x => console.log('first: ' + x));
const childSubscription = observable2.subscribe(x => console.log('second: ' + x));

subscription.add(childSubscription);

setTimeout(() => {
  // Unsubscribes BOTH subscription and childSubscription
  subscription.unsubscribe();
}, 1000);

4. Operators

 - map , filter, concat, reduce등과 같은 연산으로 처리하는 기능적 프로그래밍 스타일을 가능하게 하는 함수

 

5. Subject:

- EventEmitter와 동일하며 값이나 이벤트를 multiple Observers에게 멀티캐스팅하는 방법

import { Subject, from } from 'rxjs';

const subject = new Subject<number>();

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); // You can subscribe providing a Subject

 

6. Schedulers

- setTimeout 동시성을 제어하는 ​​중앙 집중식 디스패처로, 예를 들어 또는 기타 에서 계산이 발생할 때 조정할 수 있음

- 구독이 시작되는 시기와 알림이 전달되는 시기를 제어

- 현재 실행되는 실행 컨텍스트에서 작업을 예약하거나, 새로운 실행 컨텍스트에서 작업을 예약할 수 있다. 이를 통해 RxJS는 스레드 블로킹 없이 비동기 작업을 수행할 수 있다.

import { Observable, observeOn, asyncScheduler } from 'rxjs';

const observable = new Observable((proxyObserver) => {
  proxyObserver.next(1);
  proxyObserver.next(2);
  proxyObserver.next(3);
  proxyObserver.complete();
}).pipe(
  observeOn(asyncScheduler)
);

const 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');
반응형

'Angular' 카테고리의 다른 글

Angular Google Maps (AGM) 사용법  (1) 2024.07.11
Angular 유닛 테스트: Jasmine vs Jest 비교  (0) 2023.05.23
Angular - 타입스크립트의 장점  (0) 2023.03.20
Angular 란?  (0) 2023.03.14
Angular - NgRx란?  (0) 2023.03.08