我有一个HTTP服务,可以接收需要由多个其他API使用的响应.我想并行执行这些API调用.此外,我不想等待所有API完成执行;相反,我想在收到每个API的响应后立即对其进行处理.

这是我试图实现的目标:

  1. 我的主要HTTP服务收到响应.
  2. 此响应需要传递给多个其他API.
  3. 这些API应该并行调用.
  4. 一旦一个API响应,我就会立即处理其数据,而无需等待其他API.
search(metaInfo: Interface1, searchDetails: Interface2) {
    return this.http.post<Interface3>(API_ROUTES.history, metaInfo)
    .pipe(
      switchMap((res) => {
        return combineLatest([
          this.http.post<any>(API_ROUTES.searchOne, {...searchDetails, requestId: res.requestId}),
          this.http.post<any>(API_ROUTES.searchTwo, {...searchDetails, requestId: res.requestId})
        ])
      })
    )
  }

是否有任何rxjs操作员可以代替combineLatestforkJoin,以便我可以在响应到达时订阅响应,而不必等待两个请求都完成.

附:第一个API执行时间1秒,第二个API执行时间30-40秒,因此不能等待两个API完成执行

推荐答案

try merge个rxj

为什么使用合并?

当您有多个独立产生值的可观察量并且希望将它们的输出组合到单个流中时,合并操作符是您的首选解决方案.将其视为高速公路合并,多条道路连接在一起形成一条统一的道路--每条道路(可观察的)的交通(数据)无缝地流动在一起.

search(metaInfo: Interface1, searchDetails: Interface2) {
    return this.http.post<Interface3>(API_ROUTES.history, metaInfo)
    .pipe(
      switchMap((res) => {
        return merge(
          this.http.post<any>(API_ROUTES.searchOne, {...searchDetails, requestId: res.requestId}),
          this.http.post<any>(API_ROUTES.searchTwo, {...searchDetails, requestId: res.requestId})
        )
      })
    )
  }

一个重要的注意事项是,您需要使用下一个订阅块,这样它看起来就像

this.search.subscribe({
    next: () => {
        // processing logic here!
    }
});

Angular相关问答推荐

如何将CDkDropList与Angular FormArray和FormGroup一起使用?

声明Angular material 中按钮的自定义 colored颜色

Angular 16-错误NG8002:无法绑定到NGModel,因为它不是输入的已知属性

天使17中的倒计时器

出错后可观察到的重用

如何将 Angular 中的导航路由到同一页面并重新加载

如何检测 Angular Universal 预渲染版本?

Observable转换为Observable

Chart.js 如何编辑标题标签 colored颜色

过滤 ngfor Angular 的计数

将数组传递给 URLSearchParams,同时使用 http 调用获取请求

Subject.complete() 是否取消订阅所有听众?

ng test 和 ng e2e 之间的真正区别是什么

如何设置Angular 4背景图片?

错误:您要查找的资源已被删除、名称已更改或暂时不可用

Angular 没有可用于依赖类型的模块工厂:ContextElementDependency

CORS 错误:requests are only supported for protocol schemes: http…等

如何手动延迟加载模块?

Angular 5 响应式表单 - 单选按钮组

CustomPipe 没有提供者