承诺本身没有特定的编码限制。它们只是一个通知系统,你可以拥有数百万个这样的系统(只要你有足够的内存来保存这些 Javascript 对象)。
现在,如果一个 Promise 代表一个底层异步操作(他们通常这样做),那么可以同时运行的特定类型的异步操作的数量很可能会受到一些限制。例如,在某些时候,您可能会遇到单个主机同时接受的请求数量的限制。或者,您可能会遇到本地资源问题,其中有无数的连接。
对于像node.js磁盘I/O操作这样的事情,底层磁盘I/O子系统已经有一个排队系统,因此只有少量操作实际上同时运行,其余的操作都在排队。
因此,要回答关于可以有多少个并发操作的问题,只能在特定类型的异步请求甚至有时甚至是特定类型的接收主机的上下文中进行分析和回答。
如果您知道正在处理大量或潜在大量请求,并且将为数组中的每个项目发送网络请求,那么通常会自己编写限制以避免压垮本地资源或目标主机资源。这通常不是通过队列完成的,而是通过代码仅启动 N 个请求,然后当一个请求完成时,它启动下一个请求,依此类推。 Bluebird 和 Async 库都有为您管理此操作的方法。在蓝鸟中,它是concurrency
选项Promise.map()
。我还自己手动编写了多次管理并发连接数量的循环,下面是其中一些代码的链接:
Promise.all 消耗了我所有的 RAM https://stackoverflow.com/questions/46654265/promise-all-consumes-all-my-ram/46654592#46654592
Javascript - 如何控制并行访问网络的承诺数量 https://stackoverflow.com/questions/41028790/javascript-how-to-control-how-many-promises-access-network-in-parallel/41028877#41028877
向每分钟只能处理 20 个请求的 API 发出多个请求 https://stackoverflow.com/questions/33378923/make-several-requests-to-an-api-that-can-only-handle-20-request-a-minute/33379149#33379149
使用可变 URL 循环处理 api get 请求 https://stackoverflow.com/questions/48842555/loop-through-an-api-get-request-with-variable-url/48844820#48844820
选择适当的异步方法来进行最大请求/秒的批处理 https://stackoverflow.com/questions/36730745/choose-proper-async-method-for-batch-processing-for-max-requests-sec/36736593#36736593
Nodejs:带有 URL 列表的异步请求 https://stackoverflow.com/questions/47299174/nodejs-async-request-with-a-list-of-url/47299802#47299802