链接高阶映射运算符 - 它是如何工作的?

时间:2021-05-05 22:24:30

标签: angular rxjs rxjs-observables

我需要重置数据库中涉及操作的数据 -

  1. 获取所有数据
  2. 删除所有数据
  3. 创建新数据

按顺序,我的服务中有以下三种方法-

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 吗?

这两种方法如何产生相同的结果?

1 个答案:

答案 0 :(得分:3)

高阶映射操作符自动订阅和取消订阅它们的内部 Observable。

因此,在这两种情况下,它们都订阅了在运算符的箭头函数中调用的服务方法返回的 Observable。

这两个选项的行为相同,因为在这两种情况下,concatMap 将等待完成它的操作并发出,然后再转到它的可管道操作符或它的下一个兄弟操作符。

有意义吗?