RxJS の Scheduler とその種類

この記事は [bouzuya's RxJS Advent Calendar 2015](http://www.adventar.org/calendars/1200) の 19 日目かつ RxJS Advent Calendar 2015 の 19 日目です。

# はじめに

今日は `Scheduler` とその種類を見ていきます。内容は一覧とメモです。

[RxJS 4.0.7](https://github.com/Reactive-Extensions/RxJS/tree/v4.0.7) を対象にしています。

## Scheduler

- [`Scheduler` API Document](https://github.com/Reactive-Extensions/RxJS/blob/v4.0.7/doc/api/schedulers/scheduler.md)
- [`Scheduler` Source Code](https://github.com/Reactive-Extensions/RxJS/blob/v4.0.7/src/core/concurrency/scheduler.js)

各種 Scheduler の superclass です。`schedule` を呼び出すことで処理を必要なら遅延させて実行します。

各種 Scheduler の instance を保持しています。通常は以下の instance を使うだけで事足りると思います。

- `Scheduler.currentThread = new CurrentThreadScheduler()`
- `Scheduler.immediate = new ImmediateScheduler()`
- `Scheduler.default = Scheduler.async = new DefaultScheduler()`

また Source Code を読む上で `Scheduler` や `Scheduler.prototype.schedule` や `Scheduler.prototype.scheduleRecursive` などを読むことになると思います。

## CatchScheduler

- [`CatchScheduler` Source Code](https://github.com/Reactive-Extensions/RxJS/blob/v4.0.7/src/core/concurrency/catchscheduler.js)

`Scheduler.prototype.catch` で Scheduler で発生する Error を wrap する際に使用されています。

## CurrentThreadScheduler

- [`CurrentThreadScheduler` Source Code](https://github.com/Reactive-Extensions/RxJS/blob/v4.0.7/src/core/concurrency/currentthreadscheduler.js)

queue に入れつつ同期的に処理します。 [RxJS 5 では `queue` になります。](https://github.com/ReactiveX/RxJS/blob/master/MIGRATION.md#schedulers-renamed)

## DefaultScheduler

- [`DefaultScheduler` Source Code](https://github.com/Reactive-Extensions/RxJS/blob/v4.0.7/src/core/concurrency/defaultscheduler.js)

非同期で (setTimeout / setImmediate / nextTick など) で実行します。[RxJS 5 では `asap` になります。](https://github.com/ReactiveX/RxJS/blob/master/MIGRATION.md#schedulers-renamed)

名前に反して `Scheduler.default` はほとんどの場合に default では使われていません。`Observable.merge` や `Observable.just` では `Scheduler.immediate` が、`Observable.of` では `Scheduler.currentThread` などが default として使われています。

## HistorycalScheduler

- [`HistoricalScheduler` API Document](https://github.com/Reactive-Extensions/RxJS/blob/v4.0.7/doc/api/schedulers/historicalscheduler.md)
- [`HistorycalScheduler` Source Code](https://github.com/Reactive-Extensions/RxJS/blob/v4.0.7/src/core/concurrency/historicalscheduler.js)

指定した Date を基準に、そこからの相対時間で動作させることができます。VirtualTimeScheduler を継承しています。

## ImmediateScheduler

- [`ImmediateScheduler` Source Code](https://github.com/Reactive-Extensions/RxJS/blob/v4.0.7/src/core/concurrency/immediatescheduler.js)

特に timer を使わずに処理します。[RxJS 5 では削除 (`undefined` で指定) になります。](https://github.com/ReactiveX/RxJS/blob/master/MIGRATION.md#schedulers-renamed)

## VirtualTimeScheduler

- [`VirtualTimeScheduler` API Document](https://github.com/Reactive-Extensions/RxJS/blob/v4.0.7/doc/api/schedulers/virtualtimescheduler.md)
- [`VirtualTimeScheduler` Source Code](https://github.com/Reactive-Extensions/RxJS/blob/v4.0.7/src/core/concurrency/virtualtimescheduler.js)

Virtual Time を基準に動作する Scheduler の base class です。`HistoricalScheduler` の superclass です。ただ、使うべき場面をあまり想像できません (テスト用途?) 。

# おわりに

今日は `Scheduler` とその種類を確認しました。

はじめは実装について書こうかと思ったのですが大変そうなので諦めました。ただ `Scheduler` を把握しないとほとんど Operator の処理の流れを追うことができないので一度は確認すべきだと思います。

おそらく今日までで範囲的には

- `Observable`
- `Observer`
- `Subject`
- `Disposable`
- `Scheduler`
- 基本的な Operator

をひととおり見てきたので、もう Source Code を見ても特別新しい要素は出てこないと思います。