You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何避免嵌套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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 20:45:03