【问题标题】:Angular/RxJS combineLatest missing emitted dataAngular/RxJS combineLatest 缺少发射的数据
【发布时间】:2022-01-24 13:20:46
【问题描述】:

我有一个显示来自套接字的数据的 Angular 组件。此视图还具有过滤和搜索功能。过滤器/搜索是 Angular 表单控件。

我使用 combineLatest 来组合所有过滤器/搜索表单控件的 valueChanges 可观察对象(它们具有 startWith(''))和我的套接字可观察对象。这有助于在一个方便的地方处理数据更新和过滤更新。

由于 combineLatest 等待所有 Observables 至少发出一次...我遇到的问题是在过滤器/搜索 observables 设置并第一次发出之前,socket observable 发出了几次,因此我错过了很少需要来自套接字的数据事件。

为了简单起见,我在下面创建了一个带有计时器的简单示例。

 combineLatest([
            timer(0, 1000),
            timer(10000, 1000)
        ]).subscribe(([timerOne, timerTwo]) => {
            console.log(`Timer One Latest: ${timerOne}, Timer Two Latest: ${timerTwo}`);
        })

combineLatest 第一次发出时,定时器一已经是 9,定时器二是 0。这与我的 Angular 视图相同,套接字事件在第一次发出 combineLatest 之前已经发出了几次。我探索了缓冲或延迟第一个计时器,但没有任何效果。

我想知道是否有办法确保不会遗漏 combineLatest 中的可观察数据? 也许,在第一次 combineLatest 发射时,发射所有 timerOne 值。或者,触发 combineLatest x 次 timerOne 发出...或者我可能只是没有使用正确的运算符。

【问题讨论】:

  • 您可以在startWith('') 的帮助下为每个来源发出一次,听起来它应该可以解决您的问题

标签: angular rxjs rxjs6 rxjs-observables


【解决方案1】:

您遇到的问题与combineLatest 无关。您的问题来自这样一个事实,即您的套接字 Observable 永远不会向新订阅者发出以前的事件。当您组合常规可观察对象时,它们发出的所有先前值都“丢失”,因为发出这些值时没有订阅者。您要做的是将您的套接字变成“热可观察”并使用ReplaySubject 之类的东西与新订阅者共享所有以前的事件。只有这样,您的 combineLatest 才会收到在订阅发生之前 socked 触发的值。

换句话说,socket 发送的消息永远不会到达combineLatest,因为它订阅得太晚了。为了确保所有先前的消息都到达,您需要将套接字可观察类型更改为共享先前消息的东西,例如ReplaySubject.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-29
    • 2019-05-05
    • 1970-01-01
    • 2017-06-25
    • 1970-01-01
    • 1970-01-01
    • 2021-02-21
    • 2019-01-08
    相关资源
    最近更新 更多