堆叠承诺是否会导致节点内存泄漏?

Is stacking promises leading to a memory leek in node?

阅读 this thread,我开始怀疑我所做的是否会导致内存泄漏:

以下代码将使我能够在我的代码库中的任何位置堆叠任务,并确保每个任务仅在所有先前任务完成后执行。

function task() {
  //dummy async treatment
  return delay(100);
}
let stack = Promise.resolve('the stack is empty');

function addTask() {
  return stack = stack.then(task);
}

在一段时间内重复调用addTask时,就像每秒一样,我会发生内存泄漏吗? 如果我这样做,我应该如何解决这个问题?

非常感谢!

When repeatedly calling addTask over the time, like every second, will I have a memory leak? If I do, how should I work around this?

没有。承诺链将允许链中较早解决的承诺被垃圾收集,因此只要您为垃圾留出一些时间collection,就不应该有内存堆积。

referenced thread 创造了一个没有空闲时间的条件,它是一个无限循环,因此如果 JS 引擎始终优先触发处理程序以解决承诺而不是垃圾,则可能会累积内存使用量collection。由于服务已解决的承诺在大多数 JS 引擎中是一个非常高优先级的操作,如果一些 JS 引擎在等待触发它的 .then() 处理程序时不做任何垃圾 collection 我也不会感到惊讶。

另一方面,您的任务处理程序不是无限循环,并且确实有一些时间处理垃圾 collection(就像大多数真正的异步操作一样)。

你应该知道的一件事是,如果你要立即创建数十万个这样的任务,它会立即创建数十万个承诺,这不是调度超级内存最有效的机制大量的任务。例如,只需将它们存储在一个数组中,并在每次完成时从数组中取出下一个,这可能会提高内存效率,因为 promise object 比数组元素占用更多内存。

另一方面,如果您要创建数十个甚至数百个任务,并且队列中不会同时有数万个任务,那么您的方案将工作得很好。一旦系统做一些垃圾 collection 与现在完成的早期任务相关的已解决承诺将被垃圾收集得很好。