목차

Observables compared to other techniques

약속 대신에 관찰 대상을 사용하여 값을 비동기 적으로 전달할 수 있습니다. 마찬가지로, 관찰 가능 객체는 이벤트 핸들러를 대신 할 수 있습니다. 마지막으로 observables는 여러 값을 전달하기 때문에 어레이에서 빌드하고 작동 할 수있는 곳에 observables를 사용할 수 있습니다.

Observables는 이러한 각각의 상황에서 대체 기술과 다소 다르게 동작하지만 중요한 이점을 제공합니다. 다음은 차이점을 자세히 비교 한 것입니다.

Observables compared to promises

옵서버블은 종종 약속과 비교됩니다. 주요 차이점은 다음과 같습니다.

Creation and subscription

// declare a publishing operation
new Observable((observer) => { subscriber_fn });
// initiate execution
observable.subscribe(() => {
      // observer handles notifications
    });
// initiate execution
new Promise((resolve, reject) => { executer_fn });
// handle return value
promise.then((value) => {
      // handle result here
    });

Chaining

observable.map ((v) => 2 * v);
promise.then ((v) => 2 * v);

Cancellation

const sub = obs.subscribe (...);
sub.unsubscribe ();

Error handling

obs.subscribe (() => {
  throw Error('my error');
});

아동의 약속에 푸시 오류를 약속합니다.

promise.then (() => {
  throw Error('my error');
});

Cheat sheet

다음 코드 스니펫은 observables와 promise를 사용하여 같은 종류의 연산을 정의하는 방법을 보여줍니다.

OPERATION OBSERVABLE PROMISE
Creation
new Observable((observer) => {
    observer.next(123);
  });
new Promise((resolve, reject) => {
    resolve(123);
  });
Transform
obs.map((value) => value * 2 );
promise.then((value) => value * 2);
Subscribe
sub = obs.subscribe((value) => {
    console.log(value)
  });
promise.then((value) => {
    console.log(value);
  });
Unsubscribe
sub.unsubscribe();
Implied by promise resolution.

Observables compared to events API

Observables는 이벤트 API를 사용하는 이벤트 핸들러와 매우 유사합니다. 두 기술 모두 알림 핸들러를 정의하고 시간 경과에 따라 전달되는 여러 값을 처리하는 데 사용합니다. 관찰 가능에 가입하는 것은 이벤트 리스너를 추가하는 것과 같습니다. 한 가지 중요한 차이점은 이벤트를 처리기에 전달하기 전에 이벤트를 변환하도록 관찰 가능을 구성 할 수 있다는 것입니다.

observable을 사용하여 이벤트 및 비동기 작업을 처리하면 HTTP 요청과 같은 컨텍스트에서보다 일관된 이점을 얻을 수 있습니다.

다음은 observables 및 이벤트 API를 사용하여 동일한 종류의 작업을 정의하는 방법을 보여주는 코드 샘플입니다.

Observable Events API
Creation & cancellation
// Setup
let clicks$ = fromEvent(buttonEl, ‘click’);
// Begin listening
let subscription = clicks$
  .subscribe(e => console.log(‘Clicked’, e))
// Stop listening
subscription.unsubscribe();
function handler(e) {
  console.log(‘Clicked’, e);
}
// Setup & begin listening
button.addEventListener(‘click’, handler);
// Stop listening
button.removeEventListener(‘click’, handler);
Subscription
observable.subscribe(() => {
  // notification handlers here
});
element.addEventListener(eventName, (event) => {
  // notification handler here
});
Configuration 키 스트로크를 청취하지만 입력 값을 나타내는 스트림을 제공하십시오.
fromEvent(inputEl, 'keydown').pipe(
  map(e => e.target.value)
);
구성을 지원하지 않습니다.
element.addEventListener(eventName, (event) => {
  // Cannot change the passed Event into another
  // value before it gets to the handler
});

Observables compared to arrays

관측 대상은 시간이 지남에 따라 값을 산출합니다. 배열은 정적 인 값 집합으로 만들어집니다. 어떤 의미에서, observables는 배열이 동기적인 경우 비동기입니다. 다음 예에서 ➞ 비동기 값 전달을 의미합니다.

Observable Array
Given
obs: ➞1➞2➞3➞5➞7
obsB: ➞'a'➞'b'➞'c'
arr: [1, 2, 3, 5, 7]
arrB: ['a', 'b', 'c']
concat()
obs.concat(obsB)
➞1➞2➞3➞5➞7➞'a'➞'b'➞'c'
arr.concat(arrB)
[1,2,3,5,7,'a','b','c']
filter()
obs.filter((v) => v>3)
➞5➞7
arr.filter((v) => v>3)
[5, 7]
find()
obs.find((v) => v>3)
➞5
arr.find((v) => v>3)
5
findIndex()
obs.findIndex((v) => v>3)
➞3
arr.findIndex((v) => v>3)
3
forEach()
obs.forEach((v) => {
  console.log(v);
})
1
2
3
5
7
arr.forEach((v) => {
  console.log(v);
})
1
2
3
5
7
map()
obs.map((v) => -v)
➞-1➞-2➞-3➞-5➞-7
arr.map((v) => -v)
[-1, -2, -3, -5, -7]
reduce()
obs.scan((s,v)=> s+v, 0)
➞1➞3➞6➞11➞18
arr.reduce((s,v) => s+v, 0)
18