如何将多个可观察对象转换为在所有源可观察对象完成后发出一次的可观察对象?

时间:2018-11-21 02:17:12

标签: javascript typescript rxjs

我正在调用一个API方法(在表单提交过程中多次使用Angular的HttpClient。(它在另一件事中添加了一些东西,我们的后端人员拒绝给我批添加方法)因此,我对用户输入的每个项目都调用一次。)代码是这样的(使用lodash进行数据按摩):

const items = ['foo', 'bar', 'baz', 'quux'];
const result$: Observable[] = _.map(items, it => httpClient.post('/items', it));

我尝试使用forkJoin组合它们:

forkJoin(result$).subscribe(resp => ..., err => ...);

但是,这揭示了后端的某种错误,当我对多个项目执行此操作时会抛出该错误,但是如果我逐个添加它们则不会。 (我猜是种族状况。)

我尝试通过使用concat()来解决此问题,以使客户端一一处理请求:

concat(result$).subscribe(resp => ..., err => ...);

但是这会为每个可观察到的源触发一次订阅,我只想知道它们何时全部完成(或不完成)。我如何获得forkJoin的行为,除了不同时订阅源可观察项之外?

1 个答案:

答案 0 :(得分:0)

您可以使用concatMap

  

concatMap:将值映射到内部可观察,订阅并发出   按顺序

在您的情况下,forkJoin同时进行所有订阅,但是concatMap应该 一个一个 进行它们。

我希望这对您有用