可以或应该同时运行的 Promise 数量是否有限制?

Lar*_*rry 6 javascript network-programming promise es6-promise

令人惊讶的是,谷歌无法返回这个问题的结果。

我想知道在排队并等待下一个完成之前可以或应该并行运行多少个承诺。我想这可能取决于用户的互联网,但我认为值得一问。

如果它基于用户的 ISP/连接类型,是否有办法在启动队列之前测试发送的理想承诺数量?

另外,我是严格从客户端角度说的。所以,单线程js。

示例代码:

    function uploadToServer(requestData){
    return Promise((...));
   }

 function sendRequests(requestArray){
    var count = 0;
    for(var requestData in requestArray){
        if(count<idealAmount){
            uploadToServer(idealAmount).then(count--);
            count++;
       }else{
           // Logic to wait before attempting to fire event
       }

   }
 }
Run Code Online (Sandbox Code Playgroud)

jfr*_*d00 8

承诺本身没有特定的编码限制。它们只是一个通知系统,你可以拥有数百万个这样的系统(只要你有足够的内存来保存这些 Javascript 对象)。

现在,如果一个 Promise 代表一个底层异步操作(他们通常这样做),那么可以同时运行的特定类型的异步操作的数量很可能会受到一些限制。例如,在某些时候,您可能会遇到单个主机同时接受的请求数量的限制。或者,您可能会遇到本地资源问题,其中有无数的连接。

对于像node.js磁盘I/O操作这样的事情,底层磁盘I/O子系统已经有一个排队系统,因此只有少量操作实际上同时运行,其余的操作都在排队。

因此,要回答关于可以有多少个并发操作的问题,只能在特定类型的异步请求甚至有时甚至是特定类型的接收主机的上下文中进行分析和回答。

如果您知道正在处理大量或潜在大量请求,并且将为数组中的每个项目发送网络请求,那么通常会自己编写限制以避免压垮本地资源或目标主机资源。这通常不是通过队列完成的,而是通过代码仅启动 N 个请求,然后当一个请求完成时,它启动下一个请求,依此类推。Bluebird 和 Async 库都有为您管理此操作的方法。在 Bluebird 中,它是concurrency的选项Promise.map()。我还自己手动编写了多次管理并发连接数量的循环,下面是其中一些代码的链接:

Promise.all 消耗了我所有的 RAM

Javascript - 如何控制并行访问网络的承诺数量

向每分钟只能处理 20 个请求的 API 发出多个请求

使用可变 URL 循环处理 api get 请求

选择适当的异步方法来进行最大请求数/秒的批处理

Nodejs:带有 URL 列表的异步请求