如何避免嵌套Observables 用RxJS实现前序Observable完成后执行mergeMap
RxJS 提供了原生操作符组合可以实现你要的效果,不需要自定义 waitUntilCompletes,用 toArray + concatMap 组合即可。
逻辑说明
toArray会等待上游 Observable 完全触发完成通知后,把上游所有next抛出的返回值打包为一个数组,一次性向下游抛出,刚好对应你要的「等前序请求全量完成」的逻辑,产出的数组就是你需要的resDataArray。concatMap本身的调度逻辑就是严格按顺序执行:收到上游抛出的值后才创建内部 Observable,且必须等前一个内部 Observable 完全执行完成,才会处理下一个上游值。这里因为toArray只会抛出一次值,因此concatMap只会触发一次子页面爬取逻辑,完全符合你的流程要求。
改造后代码
import { toArray, concatMap } from 'rxjs'; const pagination = [["url-1", "url-2", "url-3", "url-4"], ["url-5"]]; const timeInterval = 2; sendRequestsInIntervals(pagination, timeInterval ) .pipe( toArray(), concatMap((resDataArray) => { return sendRequestsInIntervals(resDataArray, timeInterval ); }) ) .subscribe({ next(x) { console.log(x); }, error(err) { console.error(err); }, complete() { console.log("done"); }, });
补充说明
如果你的 sendRequestsInIntervals 本身已经是所有分页请求完成后,才一次性抛出全量结果数组而非逐次抛出单个请求结果,那可以省略 toArray 操作符,直接使用 concatMap 即可。
内容的提问来源于stack exchange,提问作者Lajos Bela
相关产品推荐
相关产品推荐

