search
LoginSignup
5

More than 5 years have passed since last update.

posted at

updated at

RxJS の Operators (9) - Conditional and Boolean Operators

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

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
What you can do with signing up
5