RxJs 6-在filter或takeWhile条件下对concatMap做出反应

时间:2018-10-30 11:57:47

标签: angular observable reactive-programming rxjs6

我使用concatMap连续进行两个API调用,但是仅在选中复选框的情况下才应运行第二个API调用。这是我的代码:

this.myService.createArticle(article)
  .pipe(
    filter(() => this.checkbox),
    concatMap(() => return this.mailer.createOtherResource(data)),
  }).subscribe(
    (x) => { console.log('OK', x); },
    error => console.error('FALLA', error),
    () => console.log('Finally I have really reached the END')
  );

问题是,如果未选中该复选框,即使第一个可观察的对象未返回错误,也永远不会运行OK函数,只有“最终”函数会运行,我需要它通知用户资源已创建。我该怎么办?

我尝试使用takeWhile而不是pipe,并且结果相同。

2 个答案:

答案 0 :(得分:1)

您订阅的最后一个回调仅在第二次调用时运行。如果您希望第一个HTTP调用一旦完成就调用方法,请尝试以下方法:

this.myService.createArticle(article)
  .pipe(
    finalize(() => console.log('Finally I have really reached the END (of the first call)'))
    filter(() => this.checkbox),
    concatMap(() => return this.mailer.createOtherResource(data)),
  }).subscribe(
    (x) => { console.log('OK', x); },
    error => console.error('FALLA', error),
    () => console.log('Finally I have really reached the END')
  );

答案 1 :(得分:0)

我不知道您的createOtherResource函数返回什么,但这是一个Observable吗?

也许您应该尝试以下方法:

this.myService.createArticle(article)
  .pipe(
    filter(() => this.checkbox),
    concatMap(() => of(this.mailer.createOtherResource(data))),
  })
  .subscribe(
    (x) => console.log('OK', x),
    error => console.error('FALLA', error),
    () => console.log('Finally I have really reached the END')
  );