약속 대신에 관찰 대상을 사용하여 값을 비동기 적으로 전달할 수 있습니다. 마찬가지로, 관찰 가능 객체는 이벤트 핸들러를 대신 할 수 있습니다. 마지막으로 observables는 여러 값을 전달하기 때문에 어레이에서 빌드하고 작동 할 수있는 곳에 observables를 사용할 수 있습니다.
Observables는 이러한 각각의 상황에서 대체 기술과 다소 다르게 동작하지만 중요한 이점을 제공합니다. 다음은 차이점을 자세히 비교 한 것입니다.
옵서버블은 종종 약속과 비교됩니다. 주요 차이점은 다음과 같습니다.
// 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 });
observable.map ((v) => 2 * v);
promise.then ((v) => 2 * v);
const sub = obs.subscribe (...); sub.unsubscribe ();
obs.subscribe (() => { throw Error('my error'); });
아동의 약속에 푸시 오류를 약속합니다.
promise.then (() => { throw Error('my error'); });
다음 코드 스니펫은 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는 이벤트 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는 배열이 동기적인 경우 비동기입니다. 다음 예에서 ➞ 비동기 값 전달을 의미합니다.
| 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 |