RxJs concatMap仅触发单个HTTP流,多流场景失效问题排查
解决concatMap无法按顺序触发HTTP请求的问题
你的代码核心问题在于请求流的处理结构冗余,导致concatMap未按预期顺序触发所有HTTP请求。以下是修复后的代码,既保留顺序一致性,又维持原有分页逻辑:
this.result .pipe( // 提取contents数组并转换为逐个发射的流 map((result: Result) => result.contents), concatMap((contents: Content[]) => from(contents)), // 按顺序发起HTTP请求,前一个请求完成后再执行下一个 concatMap((content: Content) => this.databaseService.getResource<Resource>('Type', content.key) ), // 过滤出活跃状态的资源 filter((resource: Resource) => resource.status === 'active'), // 应用分页规则 skip(this.pageIndex * this.PAGE_SIZE), take(this.PAGE_SIZE), ) .subscribe({ next: (resource: Resource) => { console.log(resource) // 按原内容顺序输出活跃资源 }, complete: () => console.log('completed') });
修复说明:
- 简化流转换逻辑:先将
result.contents数组通过from()转换为逐个发射Content对象的流,避免先批量创建Observable再处理的复杂结构。 - 明确顺序控制:第一个
concatMap确保内容按原数组顺序发射,第二个concatMap保证每个HTTP请求在前一个请求完成后才发起,严格保留请求和响应的顺序。 - 保留业务逻辑:过滤活跃资源、分页的
filter/skip/take逻辑完全保留,仅调整流的处理层级以消除混淆。
原代码中mergeMap包裹from(requests)的结构虽理论可行,但额外层级易导致逻辑混淆,若PAGE_SIZE过小或过滤后符合条件的资源不足,可能出现仅触发一次请求的情况。修复后的结构更直观,能确保所有请求按顺序执行,同时正确应用分页规则。
内容的提问来源于stack exchange,提问作者mohit
相关产品推荐
相关产品推荐

