订阅onComplete永远不会用flatMap完成

时间:2018-09-23 09:18:28

标签: javascript angular typescript rxjs rxjs6

我将Angular 6RxJS 6.2.2RxJS Compact 6.2.2一起使用。

我有一个代码可以调用我的api服务来加载一些记录,即:

this.route.params
  .flatMap((params: Params) => {
    if (!params['id']) {
      return Observable.throwError('Id is not specified.');
    }

    this.itemId = params['id'];
    this.isEditMode = true;
    this.loadCategoryGroupCondition = new LoadCategoryGroupViewModel();
    this.loadCategoryGroupCondition.id = [this.itemId];
    this.loadCategoryGroupCondition.pagination = new Pagination();

    return this.categoryGroupService
      .loadCategoryGroup(this.loadCategoryGroupCondition);
  })
  .subscribe(
    (loadCategoryGroupResult: SearchResult<CategoryGroup>) => {
      console.log(loadCategoryGroupResult);
    },
    () => {},
    () => {
      console.log('Completed')
    });

上面的代码可以打印从我的api服务返回的我的物品的列表。这意味着onSuccess已被调用。

但是会触发完整方法。 我的代码有什么问题?

谢谢

1 个答案:

答案 0 :(得分:2)

如上所述,flatMap运算符本身并未完成其可观察到的源代码。您使用this.route.params作为可观察的源,它是长期存在的-它永远不会完全完成。

要获取complete通知,可以使用take之类的运算符。它将重新发出您作为参数传递的项目数,然后完成。例如,如果您只想接收当前路线而对可观察到的源的进一步通知不感兴趣,请使用take(1),例如:

this.route.params
  .take(1)
  .flatMap((params: Params) => {

此外,请注意,在RxJS 6+中推荐的方法是使用管道运算符。看起来像这样:

this.route.params.pipe(
  first(),
  mergeMap((params: Params) => {
  ...
})

我也用推荐的新版本替换了运算符。