我将从流中读取一系列输入,并对每个输入执行HTTP GET请求。为避免一次创建太多连接,我使用async.queue将这些输入排队。

读取所有输入(将end发送到流)之后,我想收集以前的结果并生成概述。

我目前正在为此使用queue.drain。但是在我的情况下,可能会多次调用queue.drain,因为该过程可能在输入时被阻塞,并且在发生这种情况时队列将为空。

因此,异步库中是否有任何东西可以确保在处理流时仅queue.drain调用一次?我不介意切换到另一个控制流程,只要可以实现此功能。

最佳答案

在可读流上收到drain事件时,只需添加end处理程序。

var s = new SomeReadableStream();
var q = queue(your_callback, 1);

s.on('end', function() {
  // Beware: if the queue is already empty, the drain callback will never be called,
  // we have to check this by ourselves
  if (q.running() === 0 && q.length() === 0) {
    drain_cb();
  }
  else {
    q.drain = drain_cb;
  }
});

09-25 19:00