RxJS和WebWorkers

时间:2016-01-31 10:44:04

标签: angularjs system.reactive web-worker rxjs

快速提问

如果我的WebWorker有一个函数将Observable<Any>返回给UI代码,那么如果我订阅了Observable,则是在UI线程上运行的observable或{{ 1}}线程?

我问这个问题,因为我正在用RxJS编写一个Angular2应用程序,为了提高性能,我想让一些勤奋的Observable在WebWorkers中运行,将结果流传递给UI线程

3 个答案:

答案 0 :(得分:5)

我假设你的网络工作者正在通过一条消息向你的主线程发送一个observable。

消息旨在以两种方式使用,您无法发送公开功能的对象。

解决方案是让您的webworker发布消息,然后让主线程服务处理这些消息并将它们传输到Subject中,并将其作为IObservable公开给您的应用程序。

请记住,网络工作人员的消息传递不支持频道,因此如果您在应用的多个区域使用消息,则需要应用自己的鉴别器。

答案 1 :(得分:2)

简短的回答是,除非您通过SubscribeOn,ObserveOn或某些转换运算符(如Buffer)指示它,否则Rx不会引入并发性。

所以&#34;订阅&#34; Rx运算符的一部分将在您调用的同一个线程中运行.Subscribe(onNext etc)。但是实际的回调onNext,onError和onComplete将在观察者使用的任何线程上运行,你不能控制它(除非你编写了运算符)。

为确保您在UI线程上接收调用,您应该添加.ObserveOn(UIDispatcherThread)。这将保证您重新调用的线程并使其可测试。

希望有所帮助。

答案 2 :(得分:1)

正如其他人所说,调用代码和webworkers之间的通信是序列化的,因此你无法通过网络发送具有行为(如可观察的)的东西。

我写了一个小助手,使用Rxjs来帮助解决这个以及与webworkers一起开发的其他痛苦。阅读here,github repo here