希望在angular/Ionic中使用forkJoin以批处理格式调用多个API调用

vbopmzt1  于 2022-12-09  发布在  Ionic
关注(0)|答案(1)|浏览(127)

我有一系列请求,如:

let array = [req1,req2,req3.....,req(n)]

目前我正在使用forkJoin调用一个订阅者只有在获得所有请求响应后。现在我想修改我的代码,使API调用在批处理,但调用订阅者只有在完成所有批处理响应后,它可能吗?
这些例子

public demoCalls() {
       let demoForkJoin
       var a = [req1,req2,....,req45]
       a.map((data,index)=>{
            demoFrokJoin[index] = this.http.post()
       })
       forkJoin(demoForkJoin)

}

现在,我想批量调用10-10 req,而不是这样。每个10 req将在1000 ms后调用
并且只有在从所有API获得响应后才调用一个订户。(所有45个API)

demoCall().subscribe(res=>{
  // this subscribe only once after all calls are completed and got success result
})
lb3vh1jj

lb3vh1jj1#

我建议使用一些rxjs操作符的并发值来代替批处理。例如,mergeMap提供了这个值。完成一个观察对象后,下一个观察对象将成为订阅对象。添加finalize以完成操作。
以下示例具有2个并发请求

import { Observable, of, range } from 'rxjs';
import { delay, finalize, mergeMap } from 'rxjs/operators';

function req(id: number): Observable<number> {
  console.log('request received for id', id);

  return of(id).pipe(delay(5000));
}

range(0, 10)
  .pipe(
    mergeMap((r) => req(r), 2),
    finalize(() => console.log('all requests done'))
  )
  .subscribe((id) => console.log('request completed for id', id));

请在Stackblitz上查看此操作:https://stackblitz.com/edit/typescript-cmylca?file=index.ts

相关问题