【问题标题】:rxjs concatMap does not seem to be calledrxjs concatMap 似乎没有被调用
【发布时间】:2018-11-04 11:51:07
【问题描述】:

第二个concatMap 没有被调用。

this.apiService.get()
               .pipe(
                   concatMap((data: MyModel) => {
                       if (data) {
                           // the following returns a MyModel Observable
                           return this.apiService.update(data);
                       } else {
                           return empty();
                       }
                   }),
                   concatMap((data: MyModel) => this.apiService.update(this.myOtherData))
               )
               .subscribe(data => log('completed'));

有什么想法吗?

【问题讨论】:

  • 嗯,第一个有时返回空。如果第一个 concatMap 没有发出任何内容,则不会触发第二个 concatMap。它也可能被错误调用。您是否调试过代码以了解发生了什么?
  • 有趣,我本以为会有与 OP 相同的行为
  • @JBNizet 第一个API调用返回undefined,表示数据不存在。然后第一个concatMap 进入empty() 例程。你是说因为empty(),第二个永远不会被触发?
  • 是的。 concatMap 的文档说:“一个 Observable,它发出将投影函数(和可选的不推荐使用的 resultSelector)应用于源 Observable 发出的每个项目的结果”(强调我的)。如果源 observable 没有发出,则传递给 concatMap() 的回调函数永远不会被调用。顺便说一句,它的 data 参数的值是什么,因为没有数据被发出?

标签: angular rxjs observable concatmap


【解决方案1】:

你必须双管。看这里:https://github.com/reactivex/rxjs/issues/4071

timer(10).pipe(
  concatMap(() => from(wait(20)).pipe(
    concatMap(() => {
      console.log('here');
      return from(wait(20)).pipe(
        tap(x => console.log('>', x))
      );
    })
  ))
)
.subscribe(x => console.log('>', x));

你知道 concatMap 需要一个 observable 来返回吗?好吧,我刚刚了解到,如果该源 observable concatMap 存在问题,则不会触发。当它不是原因时,我很难对 concatMap 进行故障排除。

这也是我解决问题的方法,发送一个空的 observable 以确保我的设置正确。

this.sendRequest({'search': "be"}).pipe(
    concatMap(options => {
        console.log(options);
        return of([]);
    })
).subscribe(data => {
     console.log(data);
});

【讨论】:

    猜你喜欢
    • 2018-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-29
    • 2018-07-05
    • 2013-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多