asynchronous队列,文件stream结束时如何知道两者何时完成

使用async.queue与文件stream时,我遇到一个小问题

  1. 我有一个场景,我的文件stream将完成
  2. 我将fileRead设置为true
  3. 然而队列将是空的并且已经被称为排水
  4. 这导致我的“完成”永远不会被调用

我的文件stream是“结束”和队列是空的后,说“结束队列”的正确方法是什么?

var fs = require('fs') , util = require('util') , stream = require('stream') , es = require('event-stream'); var async = require('async'); var fileRead = false; var lineNr = 0; var q = async.queue(function(task, callback) { task(function(err, lineData){ responseLines.push(lineData); callback(); }); }, 5); var q.drain = function() { if(fileRead){ done(null, responseLines); } } var s = fs.createReadStream('very-large-file.csv') .pipe(es.split()) .pipe(es.mapSync(function(line){ s.pause(); q.push(async.apply(insertIntoDb, line)) s.resume(); }) .on('error', function(err){ done(err); }) .on('end', function(){ fileRead = true; }) ); 

还是有更好的使用asynchronous,这将允许我这样做? 如果其中一行有错误,则可以逐行asynchronous处理,以便能够提前退出

首先,我不知道你的代码段是多less伪代码,但var q.drain = ...是无效的JavaScript,应该错误。 它应该只是q.drain =因为你正在定义一个现有的对象没有声明一个新的variables的属性。 这可能是为什么你的排水function不是射击,如果它不是伪码。

有几种方法可以实现我认为你想要做的事情。 一个是检查你的结束处理程序队列的长度,并设置排水function,如果还有项目要处理。

 .on('end', function(){ if(!q.length){ callDone(); } else { q.drain = callDone; } }); function callDone(){ done(null, responseLines); } 

这实际上是说“如果队列已经处理完毕,如果没有,完成后就调用! 我确定有很多方法可以整理你的代码,但希望这可以为你的具体问题提供一个解决scheme。