我是一名嗜好者,并且自己一年学习角度。当尝试开发自定义分页服务以从Firebase检索数据时,我想到了在使用异步管道或普通订阅时会返回不同的数组的情况。
基本上,我的观察对象使用扫描运算符来累积从Firebase提取的数据。它有2种方法:初始化以获取第一个数据并设置可观察到的初始数据,以及addData来获取更多数据。
启动该服务并添加一些数据后,如果我再次对其进行初始化,则使用普通订阅将不会重置数据。但是,如果使用异步管道,该服务将按预期重置数据。为什么预订和异步管道在预期具有相同行为时会具有不同的行为?
我在stackblitz中创建了错误的简化再现:
https://stackblitz.com/edit/angular-3vroi2
单击“重置数据”按钮时,订阅返回不重置。异步管道返回的相同数据也会相应地重置。
就目前而言,我已经在项目中使用了异步管道,但是仍然无法理解为什么两者都不一样。希望有人可以帮助我找出答案。
答案 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)值。