在当前Angular tick的执行完成之前延迟发出可观察量

时间:2017-04-21 13:27:33

标签: angular rxjs observable

在我的Angular应用程序中,我有一堆Observable在某些数据发生变化时会发出通知。有时候,我会遇到一个案例,我需要快速连续地通知几个Observable有关数据变化的信息:

// Subscribers for observable1 are immediately notified.
observable1.next(...)

// Subscribers for observable2 are immediately notified.
observable2.next(...)

然而,这有时会导致恼人的错误。我经常遇到通知Observable s的顺序可能导致意外行为的情况。例如,observable1的订阅者可能会执行代码,假定observable2的订阅者已收到通知。

基本上我正在寻找的是一种延迟向订户发送物品的方法,直到当前的Angular滴答结束。例如,像:

observable1.next(...)
observable2.next(...)

// At the end of the current Angular tick, the subscribers
// for observable1 and observable2 are notified.

或许还有一些其他的rxjs运算符可以用来实现类似的东西......

提前致谢!

1 个答案:

答案 0 :(得分:1)

为您提供可以做您想要的选项(ish)。

这是一种典型的竞争条件:observable1observable2的订阅者声称自己是独立的,但实际上似乎是偶然的。

我使用了.delayWhen()的实现,但在{{1>}给出当前架构的情况下,唯一似乎保证两者在使用前都是最新的源头的两个Observable,发出结果,让你的订阅者分开它们:



.zip()

console.info('Waiting for Observables...');

const observable1 = Rx.Observable.of([1,2,3])
  .delayWhen(() => Rx.Observable.timer(1000));
  
const observable2 = Rx.Observable.of(['a', 'b', 'c'])
  .delayWhen(() => Rx.Observable.timer(500));

const merged = Rx.Observable.zip(observable1, observable2).share();

// Where you need the result from 1
merged.subscribe(
  next => {
    console.info("Subscriber 1");
    console.info(next[0]);
  }
);

// Where you need the result from 2
merged.subscribe(
  next => {
    console.info("Subscriber 2");
    console.info(next[1]);
  }
);




看起来很hacky?

因为它有点,但我们所做的只是明确地实现已经由架构在概念上耦合的耦合状态。

真正的解决方案是以某种方式改变体系结构,使它们不依赖(例如,通过更改生成两个可观察数据集的人返回的有效负载)。

这也只适用于这个相当简单的例子,其中Observable的总数是已知的并且在同一服务中。如果超过这两个条件,它会很快变得非常复杂。

整体架构是另一个问题,超出了这个范围,因为我们对此并不了解。