asynchronous队列,文件stream结束时如何知道两者何时完成
使用async.queue与文件stream时,我遇到一个小问题
- 我有一个场景,我的文件stream将完成
- 我将fileRead设置为true
- 然而队列将是空的并且已经被称为排水
- 这导致我的“完成”永远不会被调用
我的文件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。
- 使用nodejsasynchronous和请求模块
- Node.JS中的ASYNC
- Nodejsasynchronous编程 – 为什么需要“asynchronous”模块? 什么是“回拨地狱”/“厄运金字塔”?
- 当使用node.js async forEachSeries时,是否有等价的语句来“继续”?
- node.js中的async.js瀑布:如何使用bind和这个?
- 有没有办法停止执行下一个与nodejsasynchronous系列function?
- 如何在node.js中asynchronous执行多个REST API请求?
- 在NodeJS中插入一个大型的csv文件,200,000行+到MongoDB中
- 当使用Node和jsdom到蜘蛛网站时,会导致内存不足