RxJSとRxJavaとでは旨味のコクが違うように思う
Rx(もしくはReactive ExtensionsないしReactiveX)には
- Observable
- Operators
- Subject
- Scheduler
と云った概念がある(分類はReactiveX.io調べ)。
で、Rxを用いた非同期処理を実際に行うにあたっての実行計画を制御するための要素が Scheduler に当たり、実行タイミングや実行スレッドの制御をこれで行うことでRxはLINQ to Events足り得ており、時間軸に関係するイベントもテスタブルにしている……みたいな話はRxをかじった人なら知ってると思います。かじってない人はそんなもんだと流してください。
で、ここしばらくRxJSでいろいろやっていたのだが、このSchedulerの重みが、JavaやC#とは全く違うのであろうという仮説を抱くに至った。
メモリ空間共有型のスレッドモデルを持つJavaやC#に於いては、非同期処理・並行処理を行うにあたってはスレッドを適切に掌握する必要が有る。で、RxはSchedulerがあるおかげで、この面倒臭いスレッドの概念もそれなりに統合して取り扱えるようになっている、というのが売り文句の一つ。
一方のJavaScriptにはメモリ空間を共有するようなスレッド機能はなく、あるのはshared nothingなWorkerであり、基本はシングルイベントループをぶん回し続けるモデルになっている。そして、多くの処理は(特にNode.js方面のAPIは)非同期を前提としたAPIモデルとなっている。
故に、RxJSが提供するSchedulerは、同一スレッド上での実行タイミングの操作とテストダブルであり、スレッドをまたぐ処理への抽象化を加えるようなインパクトは無い。
なので、JavaScriptにはPromiseもあるしSchedulerのインパクトも無いし、JavaやC#の場合に比して「冒険してまで導入したい」成分は薄れているように思った。人間、華々しさや煌びやかな様子に負けて手を出すのは常なので、インパクトが無いと起爆剤が欠けるよなあ。