この記事は bouzuya's RxJS Advent Calendar 2015 の 11 日目かつ RxJS Advent Calendar 2015 の 11 日目です。
はじめに
今日は ReactiveX の Conditional and Boolean Operators について RxJS の API ドキュメントを読んだりサンプルコードを書いたりしていきます。
また RxJS 4.0.7 を対象にしています。
Observable.prototype.every
- ReactiveX - All operator
Observable.prototype.everyAPI DocumentObservable.prototype.everySource Code
ReactiveX では All ですが、RxJS では every です。
Array.prototype.every と同様にすべての値が条件を満たしたときに onNext(true) します。ひとつでも違えば、その時点で onNext(false) し onCompleted します。
import { Observable } from 'rx';
Observable
.from([1, 2, 3, 4])
.do(value => console.log(`do: ${value}`))
.every(value => value < 3)
.subscribe(
value => console.log(`onNext: ${value}`),
error => console.log(`onError: ${error}`),
() => console.log('onCompleted')
);
// do: 1
// do: 2
// do: 3
// onNext: false
// onCompleted
あえて false になる例を。途中で打ち切っているのが分かるように do をはさんでいます。
Observable.amb / Observable.prototype.amb
- ReactiveX - Amb operator
Observable.ambAPI DocumentObservable.ambSource CodeObservable.prototype.ambAPI DocumentObservable.prototype.ambSource Code
複数の Observable を取り、最初に値を流した Observable の値を次に流します。
API ドキュメントによると amb は ambiguous の意味だそうです。
Observable.prototype.amb は自身ともうひとつの Observable を取り、Observable.amb と同様に、最初のひとつを選んで利用します。
import { Observable } from 'rx';
Observable
.amb(
Observable.timer(500).map(() => '500'),
Observable.timer(300).map(() => '300')
)
.subscribe(
value => console.log(`onNext: ${value}`),
error => console.log(`onError: ${error}`),
() => console.log('onCompleted')
);
// onNext: 300
// onCompleted
Observable.prototype.includes
- ReactiveX - Includes operator
Observable.prototype.includesAPI DocumentObservable.prototype.includesSource Code
ReactiveX では Contains ですが、RxJS では削除されており includes になっています。
指定した要素が含まれていれば true をなければ false を onNext します。
import { Observable } from 'rx';
Observable
.from([1, 2, 3])
.includes(2)
.subscribe(
value => console.log(`onNext: ${value}`),
error => console.log(`onError: ${error}`),
() => console.log('onCompleted')
);
// onNext: true
// onCompleted
ちなみに Observable.prototype.indexOf もあります。
Observable.prototype.defaultifempty
- ReactiveX - DefaultIfEmpty operator
Observable.prototype.defaultifemptyAPI DocumentObservable.prototype.defaultifemptySource Code
onCompleted のタイミングで一度も onNext されていない場合に defaultValue を流します。defaultValue はデフォルトで null です。下記の例では 123 を指定しています。
import { Observable } from 'rx';
Observable
.empty()
.defaultIfEmpty(123)
.subscribe(
value => console.log(`onNext: ${value}`),
error => console.log(`onError: ${error}`),
() => console.log('onCompleted')
);
// onNext: 123
// onCompleted
Observable.prototype.sequenceEqual
- ReactiveX - SequenceEqual operator
Observable.prototype.sequenceEqualAPI DocumentObservable.prototype.sequenceEqualSource Code
ふたつの Observable で前から順に onNext の値を比較してすべて一致すれば true を流します。
import { Observable } from 'rx';
Observable
.from([1, 2, 3])
.sequenceEqual(
Observable
.from([1, 2, 3])
.delay(100)
)
.subscribe(
value => console.log(`onNext: ${value}`),
error => console.log(`onError: ${error}`),
() => console.log('onCompleted')
);
// onNext: true
// onCompleted
上記の通り、タイミングがずれても (delay(100)) 、流れてくる値が同じなら true になります。
おわりに
ReactiveX の Conditional and Boolean Operators を見ていきました。この区分の意図はあまりよくわかりません。
リスト上は skipUntil / skipWhile / takeUntil / takeWhile があったのですが、以前触れたので割愛しました。