web-dev-qa-db-ja.com

RxJSの「スケジューラ」とは何ですか

ドキュメンテーションで Scheduler という用語を頻繁に見ました。

しかし、この用語はどういう意味ですか?いわゆるSchedulerの使用方法もわかりません。公式文書は、Schedulerが正確に何であるかを教えてくれなかった。これは単なるRxJSの一般的な概念ですか、それとも特定の概念ですか?

66
yaquawa

Rxスケジューラーは、呼び出しコードが作業をスケジュールするために使用されるメカニズムを意識する必要なく、おそらく将来、作業の実行をスケジュールできるようにする抽象化を提供します。

Rxメソッドは、通知を生成する必要があるたびに、スケジューラで作業をスケジュールします。デフォルトを使用する代わりにRxメソッドにスケジューラーを提供することにより、これらの通知の送信方法を微妙に制御できます。

Rxのサーバー側実装(Rx.NETなど)では、スケジューラーが重要な役割を果たします。これらを使用すると、スレッドプールまたは専用スレッドでの重作業をスケジュールし、UIスレッドで最終サブスクリプションを実行して、UIを更新できます。

RxJを使用する場合、ほとんどのメソッドのスケジューラー引数について心配する必要があることは実際には非常にまれです。 JavaScriptは基本的にシングルスレッドであるため、スケジューリングのオプションは多くありません。通常、デフォルトのスケジューラが正しい選択です。

唯一の本当の選択肢は次のとおりです。

  • immediateScheduler-作業を同期してすぐに実行します。スケジューラをまったく使用しないようなものです。このようにスケジュールされた作業は、同期して実行されることが保証されています。
  • currentThreadScheduler-作業がすぐに実行されるという点でimmediateSchedulerと似ています。ただし、再帰的に動作するわけではありません。そのため、作業が実行されておりmore workをスケジュールしている場合、その追加作業は現在の作業が終了した後に実行されるキューに入れられます。したがって、作業は同期的に実行される場合と非同期的に実行される場合があります。このスケジューラは、スタックオーバーフローまたは無限再帰を回避するのに役立ちます。たとえば、Rx.Observable.of(42).repeat().subscribe()は、immediateスケジューラで実行された場合、無限再帰を引き起こしますが、returnはデフォルトでcurrentThreadスケジューラで実行されるため、無限再帰は避けた。
  • timeoutScheduler-将来実行される予定の作業をサポートする唯一のスケジューラー。基本的にsetTimeoutを使用してすべての作業をスケジュールします(ただし、作業を「今」実行するようにスケジュールした場合は、他の高速な非同期メソッドを使用して作業をスケジュールします)。このスケジューラでスケジュールされた作業は、非同期で実行されることが保証されています。

ブラウザのアニメーションフレームでの作業をスケジュールするスケジューラなど、もう少しあるかもしれません。

テスト可能なコードを作成しようとしている場合、ほとんど常にスケジューラー引数を指定する必要があります。これは、ユニットテストでtestSchedulerインスタンスを作成し、ユニットテストでRxコードが使用するクロックを制御できるようにする(したがって、操作の正確なタイミングを制御する)ためです。

128
Brandon