我需要重置数据库中涉及操作的数据 -
按顺序,我的服务中有以下三种方法-
getAllData(): Observable<IUser[]> {
//
}
clearAllData(users: IUser[]): Observable<boolean> {
//
}
generateNewData(cleared: boolean): Observable<IUser[]> {
//
}
在我的组件中,我像下面这样使用它们 -
resetData(): void {
this.service.getAllData()
.pipe(
concatMap(p => this.service.clearAllData(p)
.pipe(
concatMap(p => this.service.generateNewData(p))
))
)
.subscribe(
p => {
this.dataSource = p;
},
e => {
console.log('Error: ', e)
}
);
}
它有效。如果我像这样使用它们也可以使用 -
resetData(): void {
this.service.getAllData()
.pipe(
concatMap(p => this.service.clearAllData(p)),
concatMap(p => this.service.generateNewData(p))
)
.subscribe(
p => {
this.dataSource = p;
},
e => {
console.log('Error: ', e)
}
);
}
我只是想了解这两种方法在幕后的工作方式之间的区别。
据我所知,高阶映射运算符订阅它们的外部可观察对象。因此,在第一种方法中 -
concatMap()
订阅由 service.getAllData()
方法返回的可观察对象,并且concatMap()
订阅了 service.clearAllData()
方法返回的 observable(如果我错了,请纠正我)。
但是在第二种方法中,不是应该 concatMap()
都订阅 service.getAllData()
方法返回的 observable 吗?
这两种方法如何产生相同的结果?
答案 0 :(得分:3)
高阶映射操作符自动订阅和取消订阅它们的内部 Observable。
因此,在这两种情况下,它们都订阅了在运算符的箭头函数中调用的服务方法返回的 Observable。
这两个选项的行为相同,因为在这两种情况下,concatMap 将等待完成它的操作并发出,然后再转到它的可管道操作符或它的下一个兄弟操作符。
有意义吗?