2017-09-27 59 views
0

RxJS:在应用程序中的Node.js服务器上我正在处理我试图确定哪个更好:处理来自observables的所有输出辐射的单个流(通过套接字连接进一步发射) ,或者将我的观察分为几类。相对于另一种方式有什么缺点吗?让我说明我试图问...RxJS:单可观测数据比多个独立可观测数据有什么缺点?

例如:如果你是做一个聊天应用程序,你会建立一个单一的数据流,并有通过聊天室过滤掉订阅如:

handleEverythingObservable // STREAM OF ALL ROOMS 
    .filter(obj => obj.chatRoom === joinedChatRoom) 
    .subscribe(emitToConnectedSocket); 

或者你将有一个划分流进行分类,如客房,并有多个独立的流,就像一个对象:

objectOfObservables = { 
    room1: room1Observable, // STREAM OF A SINGLE ROOM 
    room2: room2Observable // STREAM OF A SINGLE ROOM 
}; 

objectOfObservables.room1.subscribe(emitToConnectedSocket); 
// NO FILTERING NECESSARY 

是否有任何的设计原则,这将导致你比其他选择的一种方式,或你甚至会做一些完全不同的事情吗?选择其中一种模式会有什么不利吗?如果单个观察者必须处理每一个对象,看起来可能会有阻塞的机会。 我在想,如果我划分了流,我可以终止它们,如果它们是空的,并且当用户正在寻找特定房间时重新打开它们。

回答

1

在你的用例中,我会去集中观察。

  1. 在会议室加入观察到的非常相似流,除了房间的名称,没有多大意义,以他们分手了,并增加复杂性

  2. 在阻塞的情况下,可以接近你所创建的可观察到的是应该支持组合,切片,延迟等以便被重用。它是否会产生阻塞通常取决于那些小的可观察段,例如你会忘记在发生故障时重试可观察,或者错误处理能力差等等。你总是用.do()运算器调试

  3. With approach on你可以随时创建一个单独的房间流,如果你需要

    让roomA $ = handleEverythingObservable.filter(obj => obj.chatRoom === joinedChatRoom).filter(obj => obj.name ==='roomA' )

  4. 在我看来,拆分比组合更容易(如果在某些情况下处理不好,很可能会遇到异步/同步问题),并允许更好的灵活性

+0

感谢您的回复。我喜欢你的方式。我将在单一流中构造它以保持简单。 –