mapLimit 有什么意义?

What's point of mapLimit?

异步库中的函数点 mapLimit 是什么?我认为 Node 使用内部线程池来限制一次异步操作的数量。此外,我们在 Node 中有单线程,它使用事件循环(这意味着我们在该线程中一次进行一个操作)。谁能解释一下我们为什么需要它?

实际上,对于网络 I/O 节点不使用线程池。它正好使用 ONE 个线程:主线程。

所以是的,节点不能并行执行代码。

但是节点可以等待事情并行发生。这就是 asynchronous/non-blocking I/O 的本质,无论您使用的天气如何 node.js 或 C++ 或 Java 或 go.

没有 mapLimit 节点将立即发出所有请求(如果您正在处理一千次下载,那么节点将尽职尽责地尝试这样做)。这并不总是可取的,因为某些服务有速率限制,而且您会 运行 遇到请求超时问题。因此 mapLimit 允许您仅并行等待有限数量的异步操作。

我终于找到了答案。这都是关于我们在 Node 中处理操作堆栈的主线程。

而我们要避免的主要问题是RangeError: Maximum call stack size exceeded。就是这样。

假设我们有很多异步操作,它们都return一些结果到主线程(到主堆栈),在它们完成工作后进行处理。

这里的重点是我们只需要以某种方式限制堆栈中它们的数量。如何?只需限制一次异步操作的数量,这样我们就不需要在异步操作完成后在主堆栈中处理很多操作。

并且重要的是要了解它并不能保证成功。因为即使我们有有限数量的并发异步操作,但我们在主堆栈中的同步操作非常慢,我们的堆栈最终还是会爆炸,无论如何我们都会得到 RangeError: Maximum call stack size exceeded