HTML5テクニカルノート
RxJS 6入門 03: Observer
- ID: FN1806001
- Technique: HTML5 / JavaScript
- Library: RxJS 6.2.0
Observer
は、Observable
が送る値を使うオブジェクトです。コールバックをまとめて、Observable
からの通知を受け取ります。RxJS 5公式「Manual」の「Observer」を下じきに、バージョン6に改め、コード例や解説も書き替えました。
01 Observerの中身
Observer
は、Observable
が送る値を受け取ります。オブジェクトが備えるのは、next()
とerror()
およびcomplete()
の3つのコールバックです。Observable
がこれらを通知します。Observer
は、つぎのようなTypeScriptのインタフェースです(図001)。
interface Observer<T> { closed?: boolean; next: (value: T) => void; error: (err: any) => void; complete: () => void; }
図001■公式REFERENCE「Observer」のページ
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つのメソッドをそれぞれ必要に応じて呼び出します。なお、complete()
またはerror()
が通知されると、そのあとデータは送られません。
const {Observable} = rxjs; const observable = Observable.create((observer) => { try { observer.next(1); observer.next(2); if (Math.random() < 0.5) { // 50%の確率でエラー const n = 1; n.notExists(); } observer.complete(); } catch(err) { observer.error(err); } }); observable.subscribe(observer);
// コンソール出力 next value: 1 next value: 2 complete // 正しく終了 // または next value: 1 next value: 2 error: TypeError: n.notExists is not a function // エラー
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 6入門
- RxJS 6入門 01: RxJSを使ってみる
- RxJS 6入門 02: Observable
- RxJS 6入門 04: Subscription
- RxJS 6入門 05: Subject
- RxJS 6入門 06: Observableをつくる関数とオペレータ
- RxJS 6入門 07: Scheduler
作成者: 野中文雄
作成日: 2018年6月1日
Copyright © 2001-2018 Fumio Nonaka. All rights reserved.