Angularjs RxJS和WebWorkers

Angularjs RxJS和WebWorkers,angularjs,system.reactive,web-worker,rxjs,Angularjs,System.reactive,Web Worker,Rxjs,快速提问 如果我有一个WebWorker,它有一个返回Observable到UI代码的函数,如果我订阅了Observable,那么Observable是在UI线程上运行还是在WebWorker线程上运行 我问这个问题是因为我正在用RxJS编写一个Angular2应用程序,为了提高性能,我希望在WebWorkers中运行一些辛勤工作的observable,将一系列结果传递给UI线程。我假设您的web worker正在通过消息将observable发送回主线程 消息的用途是双向的,不能发送公开功能的

快速提问

如果我有一个
WebWorker
,它有一个返回
Observable
到UI代码的函数,如果我订阅了Observable,那么Observable是在UI线程上运行还是在
WebWorker
线程上运行


我问这个问题是因为我正在用RxJS编写一个Angular2应用程序,为了提高性能,我希望在WebWorkers中运行一些辛勤工作的observable,将一系列结果传递给UI线程。我假设您的web worker正在通过消息将observable发送回主线程

消息的用途是双向的,不能发送公开功能的对象

解决方案是让您的webworker发布消息,然后让一个主线程服务处理这些消息并将它们导入一个主题,它将该主题作为IObservable公开给您的应用程序


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

简单的回答是,除非您通过SubscribeOn、ObserveOn或某些转换操作符(如Buffer),否则Rx不会引入并发

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

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


希望这能有所帮助。

正如其他人所指出的,调用代码和webworkers之间的通信是序列化的,因此您不能通过网络发送具有行为(如可观察到的)的内容


我已经编写了一个小助手,它使用Rxjs来帮助解决使用webworkers进行开发时遇到的问题。阅读相关内容,github repo

您的帖子没有问题,也没有您试图制作的代码示例。@shershen请再次阅读问题。它包含所有必要的信息(唯一缺少的是一个问号:),您能提供一个具有类似架构的代码示例吗?我想理解这些术语(主线程服务vs应用程序),所以您的意思是,可以在web worker和主线程之间移动的唯一对象是简单的数据对象。这是因为它们需要连载吗?Thanks@Dean对于所有意图和目的,是的,只是数据对象。基本上,您的主线程中会有一些代码订阅
onmessage
,并通过
onNext()
将收到的数据发送到
主题中。你的应用程序中需要显示此信息的部分将订阅该主题以接收更新。谢谢Richard,这很好infiRxJS还有一个
fromWorker
,它将URL带到你的Web Worker: