HTTP Observables的RxJS数组:仅在上一个完成后才触发下一个

问题描述

我有一系列可观察变量(HTTP POST请求),在特定事件发生后,我需要将它们发送给API。以下是该方法的简化示例,其中我使用concat,以便可以利用成功,错误和完整的回调。

// build up an array of stored POST requests to fire off later
// array is indeterminate length,Could be 1 request Could be 1,000
let requests = [ req1,req2,req3,req4 ];

concat(...requests).subscribe(
  success => ... handle success ...
  error => ... handle error ...
  () => ... handle completion ...
);

问题是concat基本上一次发送所有请求,从而增加了消耗请求的API中发生并发问题的可能性。如果我能够一次(而不是一次)触发请求,则应该解决此问题。我确定forEach循环不是一个选择。

是否存在一种RxJS方法,使得req2仅在req1完成之后发出,而req3仅在req2完成之后发出,依此类推?我一直在审查RxJS文档,但尚未找到适合这种情况的任何内容

解决方法

您可以使用RxJS from函数和高阶映射运算符concatMap

尝试以下

from(requests).pipe(
  concatMap(req => req)
).subscribe(
  success => ... handle success ...
  error => ... handle error ...
  () => ... handle completion ...
);

在没有concatMap运算符的情况下,数组的请求元素将逐字地作为可观察对象发出,而不是被触发。在我的其他答案here中,您可以发现b / n高阶映射运算符之间的差异。