在我的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
运算符可以用来实现类似的东西......
提前致谢!
答案 0 :(得分:1)
这是一种典型的竞争条件:observable1
和observable2
的订阅者声称自己是独立的,但实际上似乎是偶然的。
我使用了.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]);
}
);

因为它有点,但我们所做的只是明确地实现已经由架构在概念上耦合的耦合状态。
真正的解决方案是以某种方式改变体系结构,使它们不依赖(例如,通过更改生成两个可观察数据集的人返回的有效负载)。
这也只适用于这个相当简单的例子,其中Observable的总数是已知的并且在同一服务中。如果超过这两个条件,它会很快变得非常复杂。
整体架构是另一个问题,超出了这个范围,因为我们对此并不了解。