문서의 이전 판입니다!
약속 대신에 관찰 대상을 사용하여 값을 비동기 적으로 전달할 수 있습니다. 마찬가지로, 관찰 가능 객체는 이벤트 핸들러를 대신 할 수 있습니다. 마지막으로 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 }); |