【问题标题】:Subscribe onComplete never completes with flatMap使用 flatMap 订阅 onComplete 永远不会完成
【发布时间】:2019-02-27 02:28:46
【问题描述】:

我将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 已被调用。

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

谢谢你,

【问题讨论】:

  • 为什么会完成?
  • 你的标题说“永远不会完成”,但在你的问题中你说“但是完整的方法被解雇了”,那么你期望什么以及发生了什么?
  • 顺便说一句 Observable.throwError 看起来很奇怪,在以前的 rxjs 中它是 Observable.throw 而在 v6 中它只是 throwError...
  • @MartinAdámek,我会显示 2 条消息: - 第一条应该是:console.log(loadCategoryGroupResult); - 第二个应该是:console.log('Completed') 我的实际情况是: - console.log(loadCategoryGroupResult) 被调用。 - console.log('Completed') 不是
  • 那是因为this.route.params 永远不会完成。只有合并到链中的 api 调用。如果你想完成被调用,你需要完成所有源 Observables。

标签: javascript angular typescript rxjs rxjs6


【解决方案1】:

如前所述,flatMap 运算符本身并没有完成其源 observable。您正在使用 this.route.params 作为源 observable,它是长期存在的 - 它永远不会自行完成。

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

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

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

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

我还用推荐的更新变体替换了运算符。

【讨论】:

  • 我不知道上述代码的用例是什么,但是如果 params 没有发出任何值(因为路由不包含),那么首先使用(而不是 take(1) ) 将发出错误。如果我错了,请纠正我。
猜你喜欢
  • 2018-10-26
  • 2015-09-15
  • 2017-11-05
  • 2011-10-20
  • 1970-01-01
  • 2021-12-22
  • 2020-04-07
  • 1970-01-01
相关资源
最近更新 更多