2017-03-06 69 views
2

我想了解Observable和RxJS是如何工作的,所以这可能不是如何使用它们的关键。RxJS可观测量只能由一个用户处理吗?

我有一个Angular2应用程序,并且还使用RxJS Observables发送事件。现在针对特殊类型的错误事件,我想知道该事件是否已由其他订阅服务器处理。 Observable上可能存在多个订阅者,有些可能会对该事件承担全部责任,以便其他人不再需要。

这个想法来自路由事件如何在WPF中工作。在事件处理程序,你得到RoutedEventArgs参数,它有一个属性Handled

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

另一个实现例子是中间件在ASP.NET核心管线如何工作 - https://docs.microsoft.com/en-us/aspnet/core/fundamentals/middleware - 您可以拨打下一个中间件或只返回一个结果。

我正在考虑将Handled属性添加到事件中,我将它扔进可观察管道中,但我不确定这是否是RxJS中这种做法的惯用方式。

+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还有其他一些方法可以为每个客户端公开可观察的数据并监视其结果以构建管道。

+0

这在语义上与实现'Subscribable'不一样吗?如果是这样的话,如果我们直接完成的话,它可能会更容易组合。 –

+0

@AluanHaddad不,它在语义上是不同的,否则OP不会问这个问题。使用RxJS可观察数据流从一个方面:从可观察的源到订阅者。从订阅者返回到可观察源的唯一信息是订阅/取消订阅电话。这个问题是关于如何让订户沟通回上游,其他订户不应该看到价值。 – Brandon

+0

Right但Observable通过其Subscribable的实现订阅。 OP也只是说他想知道一个事件是否已经被处理,而不是在外部传达这个事实。我诚实地好奇,因为我不知道什么是有效的可订阅。换句话说就是允许像这样过滤自己?我会这样想的。 –