ReadStream 管道完成后执行循环

Execute Loop after ReadStream pipe has finished

不确定标题是否完全正确,因为我很困惑(在我的头上)...

我正在尝试从 csv 中提取 headers,作为自动化测试的一部分,以验证那些 headers。我正在使用 csv-parse 读取 csv 文件。

一旦我收集了headers,我就会做一个简单的断言来检查并针对每个断言。使用我在测试脚本中输入的字符串值。

但是目前,FOR 在 csv 读取和 headers 收集之前执行。我不确定如何在执行循环之前等待它完成。

const fs = require('fs');
const csv = require('csv-parser');
let headerArray = null;
const headerValues = values.split(',');
browser.pause(10000);
fs.createReadStream(""+global.downloadDir + "\" + fs.readdirSync(global.downloadDir)[0])
  .pipe(csv())
  .on('headers', function (headers) {
    return headerArray = headers
  })
for(var i =0; i<headerValues.length; i++){
 assert.equal(headerValues[i], headerArray[i]);
}

解决方案是 运行 for 循环和 'headers' 事件处理程序中的断言,例如:

var results = [] // we'll collect the rows from the csv into this array

var rs = fs.createReadStream(""+global.downloadDir + "\" + fs.readdirSync(global.downloadDir)[0])
  .pipe(csv())
  .on('headers', function (headers) {
    try {
      for(var i =0; i<headerValues.length; i++){
        assert.equal(headerValues[i], headers[i]);
      }
    } catch (err) {
      // an assertion failed so let's end
      // the stream (triggering the 'error' event)
      rs.destroy(err)
    }
  }).on('data', function(data) {
    results.push(data)
  }).on('end', function() {
    //
    // the 'end' event will fire when the csv has finished parsing. 
    // so you can do something useful with the `results` array here...
    //
  }).on('error', function(err) {
    // otherwise, the 'error' event will have likely fired.
    console.log('something went wrong:', err)
  })