【问题标题】:rxjs, forkJoin(array).mergeMap(...), inner mergeMap never get calledrxjs,forkJoin(array).mergeMap(...),内部 mergeMap 永远不会被调用
【发布时间】:2018-05-09 07:28:03
【问题描述】:

在我的情况下,首先可以并行执行多个请求,在这些请求完成后,将发送另一个请求与先前的结果,伪代码如下所示

let uploads$ = [obs1$, obs2$, obs3$];
Observable.forkJoin(uploads$).mergeMap(
  res => {
    // never get called if uploads$ = []
    let data = someCalculation(res);
    return this.http.post('http://endpoint/api/resource', data);
  }
).subscribe(
  res => {
  }
);

如果uploads$ = [],内部的mergeMap永远不会被调用。

有人可以帮忙吗?我在 RxJS 5.4

【问题讨论】:

  • 您可以简单地设置一个if 条件来检查uploads$ 是否为空,如果是,您将不会使用forkJoin,而是直接订阅this.http.post
  • 嗨@mar​​tin,你的想法是一个解决方案,我仍然想知道我们不能用forkJoin合并Map,但是forkJoin确实返回Observable
  • 问题是forkJoin 在其所有源 observable 发出至少一项且全部完成时发出。由于uploads$ 是空的,forkJoin 将永远不会发出任何东西。您也可以在前面添加一个虚拟的 observable let uploads$ = [Observable.of(null), obs1$, ...]; 然后忽略它,但这似乎很糟糕(这将保证每次至少有一个 observable)。
  • 一个虚拟的Observable.of(null) 可以让我的代码简单一点,谢谢@martin,节省了我的时间!

标签: rxjs rxjs5


【解决方案1】:

它不称为 b/c,源 observable 上没有发射。要创建一个,如果 observables 为空,您可以使用 defaultIfEmptytoArray 运算符。

const observables = [];
Rx.Observable.forkJoin(observables)
  .defaultIfEmpty([]) // or .toArray()
  .mergeMap(results => Rx.Observable.of(results.length))
  .subscribe(console.log);

【讨论】:

  • 太棒了!这是正确且更优雅的解决方案,谢谢!
猜你喜欢
  • 2022-08-06
  • 1970-01-01
  • 2020-03-28
  • 1970-01-01
  • 1970-01-01
  • 2022-01-24
  • 2019-01-31
  • 1970-01-01
  • 2019-09-07
相关资源
最近更新 更多