RxJS finalize():将最后发出的值传递给回调

问题描述

在我的 Angular 服务中,我有一个 loading 属性,我将 true 设置为在获取数据的方法中完成的第一件事。我想在下载数据后将 loading 设置为 false。我是在 finalize() 做的:

public fetch: (type: myType,page?: number) => Observable<any> = (
type: myType,page: number = 1
  ) => {
    return this.serviceFor(type)
      .fetchList(page,this.queryParams)
      .pipe(
        map(({ data,Meta }) => {
          return ({ collectionName: type,collection: data,Meta })
        }),finalize(() => {
          this.loading.next(false)
        })
      );
  };

现在,我有三个 loading 道具,每个道具对应不同的类型。 我想通过 type(collectionName) 来完成。 由于 finalize() 不接受任何参数,那么还有其他方法可以获取最后发出的值并在流完成时对其进行处理吗?

finalize((collectionName) => {
      switch (collectionName)
         ...
    })

链接主题https://github.com/ReactiveX/rxjs/issues/4803

编辑: kruschid 在评论中回答了问题。

解决方法

我会使用一个 tap 操作符来做任何你需要的处理 emmited 值,并保持 finalize 只是为了将加载设置为 false。您可能还需要检查 last 运算符。它们的组合应该足够了。