链接高阶映射运算符 - 它是如何工作的?
Chaining higher order mapping operators - how does it work under the hood?
我需要重置数据库中涉及操作的数据 -
- 获取所有数据
- 删除所有数据
- 创建新数据
依次类推,我的服务中有以下三个方法-
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()
方法返回的observable,
- 第二个
concatMap()
订阅了service.clearAllData()
方法 返回的observable
(如有错误请指正)
但是在第二种方法中,不应该 concatMap()
都订阅 service.getAllData()
方法返回的可观察对象吗?
这两种方法如何产生相同的结果?
高阶映射运算符自动订阅和取消订阅其 inner Observable。
所以在这两种情况下,他们都订阅了在操作符的箭头函数中调用的服务方法返回的 Observable。
这两个选项的行为相同,因为在这两种情况下,concatMap 将等待完成其操作并发出,然后再继续其可管道运算符或下一个同级运算符。
有道理吗?
我需要重置数据库中涉及操作的数据 -
- 获取所有数据
- 删除所有数据
- 创建新数据
依次类推,我的服务中有以下三个方法-
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()
方法返回的observable, - 第二个
concatMap()
订阅了service.clearAllData()
方法 返回的observable
(如有错误请指正)
但是在第二种方法中,不应该 concatMap()
都订阅 service.getAllData()
方法返回的可观察对象吗?
这两种方法如何产生相同的结果?
高阶映射运算符自动订阅和取消订阅其 inner Observable。
所以在这两种情况下,他们都订阅了在操作符的箭头函数中调用的服务方法返回的 Observable。
这两个选项的行为相同,因为在这两种情况下,concatMap 将等待完成其操作并发出,然后再继续其可管道运算符或下一个同级运算符。
有道理吗?