如何解决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高阶映射运算符之间的差异。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。