2016-01-31 6 views
5

クイック質問RxJSとWebWorkers

私はその後、観察可能に加入している場合、バックUIコードにObservable<Any>を返す関数を持っているWebWorkerを持っている場合は、UIスレッドまたはWebWorker上で観察動作しています糸?

私はUIスレッド

+0

あなたの投稿は問題ではなく、あなたが作ってみようとしているコードサンプルはありません。 – shershen

+1

@ shershen質問をもう一度お読みください。それにはすべての必要な情報が含まれています(欠けているものは疑問符です:) – supertopi

答えて

5

にかけた結果のストリームを渡し、私はRxJSでAngular2アプリを書いていますので、この質問を、私は勤勉な観測の一部がWebWorkers内で実行したいパフォーマンスを向上させるために、私はあなたのWebワーカーがあなたのメインスレッドにメッセージを介して観測可能なバックを送信していると仮定します。

メッセージは両方向で使用するためのもので、機能を公開するオブジェクトを送信することはできません。

解決策は、あなたのWebワーカーにメッセージを投稿させてから、メインスレッドサービスでこれらのメッセージを処理し、それらをSubjectにパイプしてアプリケーションにIObservableとして公開することです。

ウェブワーカーメッセージングは​​チャンネルをサポートしていないので、アプリの複数の領域でメッセージを使用する場合は、独自の弁別器を適用する必要があります。

+0

同様のアーキテクチャのコードサンプルを提供してください。私は用語(メインスレッドサービスとアプリケーション) – supertopi

+0

を理解したいので、Webワーカーとメインスレッド間を移動できる唯一のオブジェクトは単純なデータオブジェクトであると言っています。彼らは連載される必要があるからですか?ありがとう –

+0

@Deanすべての目的と目的のために、はい、ちょうどデータオブジェクト。本質的には、あなたのメインスレッドに 'onmessage'を購読し、受け取ったデータを' onNext() 'を介して' Subject'に送り出すコードが少しあります。この情報を表示する必要があるアプリケーションの部分は、更新を受け取るためにそのサブジェクトにサブスクライブします。 –

2

簡単な答えは、Rxが、SubscribeOn、ObserveOn、またはBufferのような変換演算子を介して指示しない限り、並行処理を導入しないことです。

したがって、Rx演算子の「購読」部分のコードは、「購読」(onNextなど)という名前の同じスレッドで実行されます。しかし実際のコールバックonNext、onError、onCompleteは、オブザーバが使用するスレッドがあれば実行されますが、オペレータを書いた場合を除いて、これを制御しません。

UIスレッドで確実にコールを受信するには、。ObserveOn(UIDispatcherThread)を追加する必要があります。これにより、呼び出されたスレッドが保証され、テスト可能になります。

希望に役立ちます。

0

他の人が指摘したように、呼び出しコードとWebワーカーとの間の通信はシリアル化されているため、ワイヤ上でビヘイビア(観測可能なもの)を持つものは送信できません。

私は、Rxjsを使用してウェブワーカーとの開発のこの問題やその他の苦労を解決するための小さなヘルパーを作成しました。それについて読むhere、github repo here