我正在使用Node csv-parser,我的读取流来自std in。我正在将它传递给解析器。在解析器可读函数内部,我正在进行异步HTTP调用以上传此数据。在此期间,我希望解析器暂停读取。直到异步调用完成了。
var parse = require('csv-parse');
var output = [];
// Create the parser
var parser = parse({delimiter: ',', columns: true, trim: true});
parser.on('readable', function () {
while (record = parser.read()) {
console.log('Still reading');
var jsonRec = convertIpToInt(record);
var jsonData = JSON.stringify(jsonRec);
output.push(new Buffer(jsonData + "\n"));
//parser.pause();
var assertPromise = uploadBatches1(indexName, function() {
//parser.resume();
console.log('Returned');
});
}
});
function uploadBatches1(indexToAssert, cb) {
//uploads data got form parser
}

答案 0 :(得分:2)
由于csv-parse公开了一个可读的流,您可以使用parser.pause()
暂停流
同样,更新完成后,您可以致电parser.resume()
。您还可以使用parser.isPaused()
检查是否需要事先恢复。
您可以阅读有关可读流的更多信息以及暂停方法在此处执行的操作: https://nodejs.org/api/stream.html#stream_readable_pause
基于以上所述,您应该实现parser.on('data')
可读流事件,而不是while (record = parser.read())
循环。如果您自己主动调用read方法,则暂停流无效。
考虑重构代码,然后使用文件系统中的parser.pipe读取:
var parse = require('csv-parse');
var output = [];
// Create the parser
var parser = parse({delimiter: ',', columns: true, trim: true});
parser.on('data', function () {
console.log('Still reading');
var jsonRec = convertIpToInt(record);
var jsonData = JSON.stringify(jsonRec);
output.push(new Buffer(jsonData + "\n"));
parser.pause();
var assertPromise = uploadBatches1(indexName, function() {
parser.resume();
console.log('Returned');
});
});
function uploadBatches1(indexToAssert, cb) {
//uploads data got form parser
}