LoginSignup
5
5

More than 5 years have passed since last update.

RxJS の Operators (9) - Conditional and Boolean Operators

Last updated at Posted at 2015-12-11

この記事は 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 ですが、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

複数の 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 では Contains ですが、RxJS では削除されており includes になっています。

指定した要素が含まれていれば true をなければ falseonNext します。

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

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

ふたつの 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 があったのですが、以前触れたので割愛しました。

5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5