RxJS Observable只能由一个订户处理吗?

时间:2017-03-06 21:20:02

标签: javascript events rxjs routedevent

我试图理解Observables和RxJS是如何工作的,所以这可能不是如何使用它们的。

我有一个Angular2应用程序,另外还使用RxJS Observables来发送事件。现在,对于一种特殊类型的错误事件,我想知道该事件是否已被另一个订阅者处理。 Observable上可能存在多个订阅者,有些人可能会对该事件承担全部责任,以便其他人不再获得该事件。

这个想法来自于路由事件在WPF中的工作方式。在事件处理程序中,您获得RoutedEventArgs参数,该参数具有属性Handled

  

如果设置,如果要标记处理事件,则设置为true;否则是假的。如果读取此值,则true表示类处理程序或路径中的某个实例处理程序已标记此事件已处理。 false。表示没有这样的处理程序标记了处理的事件。

另一个实现示例是中间件如何在ASP.NET Core Pipeline中工作 - https://docs.microsoft.com/en-us/aspnet/core/fundamentals/middleware - 您可以调用下一个中间件或只返回结果。

我正在考虑将Handled属性添加到我抛入可观察管道的事件中,但我不确定这是否是在RxJS中执行此操作的惯用方法。

1 个答案:

答案 0 :(得分:1)

通常,使用observables执行此操作的方式是将observable交给每个人,并且每个人都订阅它。相反,你给每个感兴趣的一方提供“添加到管道”的机会,然后最终订阅一次。有很多方法可以做到这一点。最简单的是不要给任何人提供可观察的信息。但是让他们为你提供回调:

class Foo {

   observable = ...;
   callbacks = [];

   addCallback(callback) { this.callbacks.push(callback); }

   constructor() {

       // subscribe to the observable and call any registered callbacks
       this.observable.subscribe(e => {
           for (const cb of this.callbacks) {
               // callback returns true if it has "handled" the event
               if (cb(e)) {
                   return; // do not call any other callbacks
               }
           }
       });
   }
}

const foo = new Foo();

// subscriber1 handles "type1" events
foo.addCallback(ev => ev.type === "type1");

// subscriber2
foo.addCallback(ev => ev.type === "type2");

这是最简单的方式。还有其他方法Foo公开每个客户的可观察量,并监控其结果以构建管道。