Angular 如何以最大并行请求数发送1000个XHTTP请求

Angular 如何以最大并行请求数发送1000个XHTTP请求,angular,rxjs,xmlhttprequest,Angular,Rxjs,Xmlhttprequest,我有一个Angular应用程序,它需要发送N个XHTTP请求,其中1可以尝试使用RxJS和运算符 从bufferCount文档: 收集发出的值,直到满足提供的数字,按 数组 因此,它收集n个通知并将其作为一个数组发出。然后,我们可以通过forkJoin将数组传递给n个并行请求 试试下面的方法 我假设this.url是一个HTTP请求集合,类似于 URL=[ this.http.get'url1', this.http.get'url2', this.http.get'url3', ... ];

我有一个Angular应用程序,它需要发送N个XHTTP请求,其中1可以尝试使用RxJS和运算符

从bufferCount文档:

收集发出的值,直到满足提供的数字,按 数组

因此,它收集n个通知并将其作为一个数组发出。然后,我们可以通过forkJoin将数组传递给n个并行请求

试试下面的方法

我假设this.url是一个HTTP请求集合,类似于

URL=[ this.http.get'url1', this.http.get'url2', this.http.get'url3', ... ]; 然后请求触发代码看起来像

缓冲请求{ 从this.url.pipe bufferCount6,//forkJoinbuffer 订阅 res=>console.logres, err=>console.logerr, =>控制台。日志“完成” ; } 根据Chromium工程师的评论,最大主机/域连接限制的实际解决方案是使用WebSocket或域分片。但是,由于您提到在您的环境中不可能这样做,因此可以使用缓冲请求解决方案

然而,我不会试图缓冲到最大限度。如果您向同一域发送的请求超过了允许的最大值,那么您可以看到,在上述请求完成之前,额外的请求实际上会被延迟。因此,假设您的应用程序将缓冲区设置为允许的最大限制,并且您的应用程序从应用程序工作流所依赖的其他位置向同一域发送额外请求,则整个应用程序可能会受到限制

所以最好使用WebSocket或域切分。如果两者都不可能,最好将请求缓冲到小于*最大允许限制的请求数

*显然,如果您100%确定在缓冲过程中不会触发对同一域的其他请求,那么您可以将缓冲设置为允许的最大限制。

您可以尝试使用RxJS和运算符

从bufferCount文档:

收集发出的值,直到满足提供的数字,按 数组

因此,它收集n个通知并将其作为一个数组发出。然后,我们可以通过forkJoin将数组传递给n个并行请求

试试下面的方法

我假设this.url是一个HTTP请求集合,类似于

URL=[ this.http.get'url1', this.http.get'url2', this.http.get'url3', ... ]; 然后请求触发代码看起来像

缓冲请求{ 从this.url.pipe bufferCount6,//forkJoinbuffer 订阅 res=>console.logres, err=>console.logerr, =>控制台。日志“完成” ; } 根据Chromium工程师的评论,最大主机/域连接限制的实际解决方案是使用WebSocket或域分片。但是,由于您提到在您的环境中不可能这样做,因此可以使用缓冲请求解决方案

然而,我不会试图缓冲到最大限度。如果您向同一域发送的请求超过了允许的最大值,那么您可以看到,在上述请求完成之前,额外的请求实际上会被延迟。因此,假设您的应用程序将缓冲区设置为允许的最大限制,并且您的应用程序从应用程序工作流所依赖的其他位置向同一域发送额外请求,则整个应用程序可能会受到限制

所以最好使用WebSocket或域切分。如果两者都不可能,最好将请求缓冲到小于*最大允许限制的请求数


*显然,如果您100%确定在缓冲过程中不会触发对同一域的其他请求,那么您可以将缓冲区设置为允许的最大限制。

如果您直接尝试同时发送1000个请求,会发生什么情况?浏览器不在引擎盖下管理它们吗?哦,inetersting!因此,您认为这种浏览器限制意味着程序将被阻止,直到发送所有请求,而不是在达到限制后失败?在这种情况下,浏览器已经管理了我想要实现的内容?并没有完全阻止,从脚本的角度来看,它们只是常规的异步操作。他们立刻都出去了,即使实际上只有8个人同时活着。谢谢你的澄清。这意味着我根本不需要处理这个问题。如果这是一个答案,我会接受这个评论:嘿,你不需要处理任何额外的事情,但是如果你不想取消上一个请求,你应该使用mergeMap使请求并行,而不是使用SwitchMap。如果你直接尝试同时发送1000个请求,会发生什么?浏览器不在引擎盖下管理它们吗?哦,inetersting!因此,您建议此浏览器限制意味着程序将被阻止,直到发送所有请求,而不是失败
达到极限后?在这种情况下,浏览器已经管理了我想要实现的内容?并没有完全阻止,从脚本的角度来看,它们只是常规的异步操作。他们立刻都出去了,即使实际上只有8个人同时活着。谢谢你的澄清。这意味着我根本不需要处理这个问题。我会接受这个评论,如果它是一个答案的话:嘿,你不需要处理任何额外的事情,但是如果你不想取消之前的请求,你应该使用mergeMap使请求并行,而不是使用SwitchMap。
const test = () =>
  request(`https://swapi.co/api/people/1/`)
    .pipe(
      delay(1000),
      switchMap(response => from(response.films)),
      concatMap((url: string) => request(url).pipe(delay(1000))),
      scan((acc, res) => [...acc, res.title], []),
      tap(console.log)
    )
    .subscribe()
const test = () =>
  request(`https://swapi.co/api/people/1/`)
    .pipe{
      switchMap(response => from(response.films)),
      specialOperatorIAmLookingFor((url: string) => request(url), 8),   // where '8' is the maximum number of paralell requests
      scan((acc, res) => [...acc, res.title], []),
      tap(console.log)
    )
    .subscribe()