【问题标题】:RxJS: Are there any disadvantages of Single Observables over Multiple Separate Observables?RxJS:单个 Observable 相对于多个单独的 Observable 有什么缺点吗?
【发布时间】:2017-09-27 09:21:35
【问题描述】:

RxJS:在我目前正在开发的应用程序的 Node.js 中的服务器上,我正在尝试确定哪个更好:处理所有来自可观察对象的传出发射的单个流(通过套接字连接进一步发射) ),或者将我的可观察对象分为几类。一种方式比另一种方式有什么缺点吗?让我说明一下我想问的问题...

例如:如果您要制作一个聊天应用程序,您是否会设置一个流并通过聊天室过滤掉订阅,例如:

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

是否有任何设计原则会导致您选择一种方式而不是另一种方式,或者您甚至会做一些完全不同的事情?选择其中一种模式会有什么缺点吗?如果单个 observable 必须处理每个单个对象,那么似乎可能会有阻塞的机会。 我在想,如果我分割流,如果它们是空的,我可以终止它们,并在订阅者正在寻找特定房间时重新打开它们。

【问题讨论】:

    标签: javascript node.js rxjs


    【解决方案1】:

    在您的用例中,我会选择集中式 observable。

    1. 在 room join 上 observable 是非常相似的流,除了房间的名称,没有太大意义将它们拆分并增加复杂度

    2. 在阻塞的情况下,您创建的任何一种方法都应该支持合并、切片、延迟等以便被重用。它是否会创建阻塞通常取决于您将制作的那些小的可观察片段,例如当它悄悄失败时忘记重试可观察片段,或者错误处理不当等。您总是使用 .do() 运算符进行调试

    3. 如果需要,您可以随时创建单独的房间流

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

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

    【讨论】:

    • 感谢您的回复。我喜欢你说的方式。为了简单起见,我会将其构建在一个流中。
    猜你喜欢
    • 1970-01-01
    • 2020-12-01
    • 2020-12-29
    • 1970-01-01
    • 1970-01-01
    • 2019-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多