HTML5テクニカルノート
RxJS入門 03: Observer
- ID: FN1802006
- Technique: HTML5 / JavaScript
- Library: RxJS 5.5.6
Observer
は、Observable
が送る値を使うオブジェクトです。コールバックをまとめて、Observable
からの通知を受け取ります。公式「Manual」の「Observer」を下じきに、サンプルコードや解説は改めました。
01 Observerの中身
Observer
は、Observable
が送る値を受け取ります。オブジェクトが備えるのは、next()
とerror()
およびcomplete()
の3つのコールバックです。Observable
がこれらを通知します。Observer
は、つぎのようなインタフェースです。
interface Observer<T> { closed?: boolean; next: (value: T) => void; error: (err: any) => void; complete: () => void; }
02 Observerの例
Observer
には、next()
とerror()
およびcomplete()
の3つのコールバックをメソッドとして与えます。つぎのコードは、3つのメソッドを定めたObserver
オブジェクトの例です。
const observer = { next(x) {console.log('next value: ' + x)}, error(err) {console.error('error: ' + err)}, complete() {console.log('complete')} };
Observer
はObservable
を実行(サブスクライブ)するときに渡されます。実行に用いるのはObservable.subscribe()
です。Observer
は、Observable
に与えられたコールバック(Observable.create()
の引数)が引数として受け取り、Observer
の3つのメソッドをそれぞれ必要に応じて呼び出します。なお、error()
またはcomplete()
が通知されると、そのあとデータは送られません。
const observable = Rx.Observable.create((observer) => { try { observer.next(1); observer.next(2); if (Math.random() < 0.5) { const n = 1; n.notExists(); } observer.complete(); } catch(err) { observer.error(err); } }); observable.subscribe(observer); // コンソール出力 next value: 1 next value: 2 error: TypeError: n.notExists is not a function // または next value: 1 next value: 2 complete
Observer
のコールバックは、3つ揃わなくても構いません。メソッドのあるなしにかかわらず、Observable
の実行はできて、通知も送られます。けれども、Observer
にそのコールバックがなければ何も起こらないというだけです。
const observer = { next(x) {console.log('next value: ' + x)}, complete() {console.log('complete')} };
コールバックがnext()
ひとつのときは、Observer
オブジェクトはつくらずに、Observable.subscribe()
の引数に関数をじかに渡すこともできます。Observer
オブジェクトは内部的につくられてObservable
に渡され、引数の関数はnext()
のコールバックとして加えられるのです。
observable.subscribe((x) => console.log('next value: ' + x));
さらに、Observable.subscribe()
の第2および第3引数に関数を与えると、それぞれerror()
とcomplete()
のコールバックとみなされます。たとえば、error()
はとばして、complete()
にコールバックを加えたいときは、第2引数はundefined
にすればよいのです。
observable.subscribe( (x) => console.log('next value: ' + x), undefined, () => console.log('complete') );
RxJS入門
- RxJS入門 01: RxJSを使ってみる
- RxJS入門 02: Observable
- RxJS入門 04: Subscription
- RxJS入門 05: Subject
- RxJS入門 06: オペレータ
- RxJS入門 07: Scheduler
作成者: 野中文雄
作成日: 2018年2月21日
Copyright © 2001-2018 Fumio Nonaka. All rights reserved.