RxJS 和网络工作者

RxJS and WebWorkers

快速提问

如果我有一个 WebWorker 具有 returns 一个 Observable<Any> 回到 UI 代码的功能,如果我然后订阅 Observable,是在 UI 线程或 WebWorker 线程上观察 运行ning?

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

我假设您的 Web Worker 正在通过消息将可观察对象发送回您的主线程。

消息旨在双向使用,您不能发送公开功能的对象。

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

请记住,Web Worker 消息传递不支持通道,因此如果您在应用的多个区域使用消息,则需要应用自己的鉴别器。

简短的回答是 Rx 不会引入并发,除非你通过 SubscribeOn、ObserveOn 或像 Buffer 这样的转换运算符来指示它。

因此,Rx 运算符 "Subscribe" 部分中的任何代码都将 运行 在您调用 .Subscribe(onNext 等) 的同一线程中。然而,实际的回调 onNext、onError 和 onComplete 将 运行 在观察者使用的任何线程上,你无法控制它(除非你编写了运算符)。

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

希望对您有所帮助。

正如其他人指出的那样,调用代码和网络工作者之间的通信是序列化的,因此您不能通过网络发送具有行为(例如可观察到的)的东西。

我写了一个小帮手,它使用 Rxjs 来帮助解决这个问题以及使用 webworker 进行开发的其他问题。了解一下 here, github repo here