使用订阅管道与异步管道时,来自同一可观察到的结果不同

时间:2019-06-08 19:23:02

标签: angular rxjs

我是一名嗜好者,并且自己一年学习角度。当尝试开发自定义分页服务以从Firebase检索数据时,我想到了在使用异步管道或普通订阅时会返回不同的数组的情况。

基本上,我的观察对象使用扫描运算符来累积从Firebase提取的数据。它有2种方法:初始化以获取第一个数据并设置可观察到的初始数据,以及addData来获取更多数据。

启动该服务并添加一些数据后,如果我再次对其进行初始化,则使用普通订阅将不会重置数据。但是,如果使用异步管道,该服务将按预期重置数据。为什么预订和异步管道在预期具有相同行为时会具有不同的行为?

我在stackblitz中创建了错误的简化再现:

https://stackblitz.com/edit/angular-3vroi2

单击“重置数据”按钮时,订阅返回不重置。异步管道返回的相同数据也会相应地重置。

就目前而言,我已经在项目中使用了异步管道,但是仍然无法理解为什么两者都不一样。希望有人可以帮助我找出答案。

1 个答案:

答案 0 :(得分:0)

问题出在这里:

 this.data = this._data.asObservable().pipe(
      scan( (acc, val) => {
        return acc.concat(val)
      }, []),
      shareReplay(1)
    )

此声明对已经订阅了this.data的旧值的订阅者没有任何影响-例如您在child.component中的手动订阅-他们将保持订阅旧值。

另一方面,您的异步管道正在订阅当时恰好存储在page.data中的任何值。

<li *ngFor="let item of page.data|async">{{item}}</li>

因此,当您将page.data设置为新的Observable时,异步管道将从page.data的旧(Observable)值退订,并订阅新的(Observable)值。