2016-01-31 12 views
5

Kurze FrageRxJS und Webworkers

Wenn ich eine WebWorker, die eine Funktion hat, die eine Observable<Any> zurück an den UI-Code zurückgibt, wenn ich dann auf die beobachtbare abonnieren, ist der beobachtbare Lauf auf dem UI-Thread oder der WebWorker Faden?

Ich stelle diese Frage, weil ich eine Angular2 App mit RxJS schreibe, und die Leistung zu verbessern ich einige wollen von der fleißigen Observablen innerhalb Webworkers zu laufen, einen Strom von Ergebnissen über auf dem UI-Thread vorbei

+0

Ihr Beitrag hat keine Frage, und kein Code-Beispiel, das Sie versuchen zu arbeiten. – shershen

+1

@shershen Bitte lesen Sie die Frage erneut. Es enthält alle notwendigen Informationen (nur etwas fehlt ist ein Fragezeichen :) – supertopi

Antwort

5

Ich nehme an, dass Ihr Web-Mitarbeiter über eine Nachricht eine beobachtbare Nachricht an Ihren Haupt-Thread sendet.

Nachrichten sollen auf beide Arten verwendet werden, Sie können keine Objekte senden, die Funktionalität offen legen.

Die Lösung besteht darin, dass Ihr Webworker Nachrichten posten und dann ein Hauptthread-Dienst diese Nachrichten verarbeiten und diese an einen Subject weiterleiten lässt, den er Ihrer Anwendung als IObservable zur Verfügung stellt.

Denken Sie daran, dass Web-Worker-Messaging Kanäle nicht unterstützt. Daher müssen Sie Ihren eigenen Diskriminator anwenden, wenn Sie Nachrichten in mehreren Bereichen Ihrer App verwenden.

+0

Könnten Sie bitte ein Codebeispiel mit ähnlicher Architektur zur Verfügung stellen? Ich würde gerne die Begriffe (main-thread service vs application) – supertopi

+0

verstehen, also sagen Sie, dass die einzigen Objekte, die sich zwischen dem Web-Worker und dem Haupt-Thread bewegen können, einfache Datenobjekte sind. Ist das, weil sie serialisiert werden müssen? Danke –

+0

@Dean Für alle Absichten und Zwecke, ja, nur Datenobjekte. Im Wesentlichen haben Sie in Ihrem Hauptthread ein wenig Code, der "onmessage" abonniert und die empfangenen Daten über 'onNext()' in ein 'Subject' sendet. Der Teil Ihrer App, der diese Informationen anzeigen muss, würde diesen Betreff abonnieren, um Updates zu erhalten. –

2

Die kurze Antwort ist, dass Rx keine Nebenläufigkeit einführt, wenn Sie es nicht über SubscribeOn, ObserveOn oder einen Transformationsoperator wie Buffer anweisen.

Also jeder Code im "Subscribe" Teil des Rx-Betreibers wird in demselben Thread laufen, den Sie .Subscribe (onNext etc) genannt haben. Die tatsächlichen Callbacks onNext, onError und onComplete werden jedoch auf jedem Thread ausgeführt, den der Beobachter verwendet, Sie steuern dies nicht (es sei denn, Sie haben den Operator geschrieben).

Um sicherzustellen, dass Sie Aufrufe für den Benutzeroberflächenthread erhalten, sollten Sie ein .ObserveOn (UIDispatcherThread) hinzufügen. Dies garantiert den Thread, auf den Sie zurückgerufen werden, und macht ihn testbar.

Hoffe, dass hilft.

0

Wie andere angemerkt haben, ist die Kommunikation zwischen dem aufrufenden Code und den Webworkern serialisiert, und Sie können also nichts senden, das Verhalten (wie eine Observable) über die Leitung hat.

Ich habe einen kleinen Helfer geschrieben, der Rxjs verwendet, um diese und andere Probleme bei der Entwicklung mit Webworkern zu lösen. Lesen Sie darüber here, Github Repo here