【问题标题】:Chain multiple calls with foreach loop and Observable使用 foreach 循环和 Observable 链接多个调用
【发布时间】:2018-03-24 19:09:38
【问题描述】:

我想将多个请求链接到我从数组中获取的 url。在下一个链之前,我想等待上一个链完成。前一个是否失败并不重要。我正在尝试使用 forkJoin 进行此操作,但我知道如果其中一个请求失败,它将返回错误。

this.dataServers.forEach(dataServer => {
    observableBatch.push(this.getFoodsByQuery(dataServer.url, query));
});

return Observable.forkJoin(observableBatch).subscribe(data => {
    this.searchingServer.next(null);
    observer.complete();
});

我不知道如何用 flatMap 做到这一点。

【问题讨论】:

标签: angular rxjs observable


【解决方案1】:

在您的情况下,合适的运营商是concat

通过顺序发射将多个 Observable 连接在一起 它们的值,一个接一个的 Observable。

例子:

// Batch of requests
let batch = [
  Observable.of(1),
  Observable.of(2).delay(1500),
  Observable.throw('Error'),
  Observable.of(3).delay(300),
  Observable.throw('Error again'),
  Observable.of(4).delay(600)
];

// Catch (ignore) error of every request
batch = batch.map(obs => {
  return obs.catch(err => Observable.of(err));
});

// Concat observables 
Observable.concat(...batch).subscribe({
  next: v => console.log(v),
  complete: () => console.log('Complete')
});

输出:

1
2
'Error'
3
'Error again'
4
'Complete'

【讨论】:

  • 看起来很棒我已经编辑了我的问题代码,在这种情况下我必须订阅 v 而我的问题是,在我订阅所有 next 之前完成已解决。
  • 我还有一个问题,因为我无法订阅 v 元素,但我需要 Observable.concat(...observableBatch).subscribe({ next: v => { v.subscribe(data => { this.searchingServer.next(this.dataServers[index]); index ++; observer.next(data); if(index == this.dataServers.length){ observer.complete(); this.searchingServer.next(null); } }) }, complete: () => console.log("complete") });
【解决方案2】:

您是否尝试过将 OnErrorResumeNext() 与 forkJoin 一起使用?

return Observable.forkJoin(observableBatch)
.OnErrorResumeNext()
.subscribe(data => {
  this.searchingServer.next(null);
  observer.complete();
});

【讨论】:

  • 但是这个调用是一一完成的,就像使用 flatMap 一样?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-31
  • 1970-01-01
  • 2013-04-27
  • 2018-05-15
  • 1970-01-01
  • 2020-05-01
  • 1970-01-01
相关资源
最近更新 更多