第370次迭代后异步等待循环停止

时间:2017-09-18 12:50:47

标签: javascript node.js loops async-await

我正在尝试以块的形式加载大型csv文件(GB的大小)。代码如下:

lineReader.open(filename,async function(err, reader) {
  if (err) throw err;
  var dataArr=[]; 
  while (reader.hasNextLine()) {
    reader.nextLine(function(err, line) {
      if(err) throw err;
      console.log(line);
      dataArr.push(csv_parse(line,headers));
    });
    console.log(dataArr.length);
    if(dataArr.length == 3000){
      console.log(JSON.stringify(dataArr));
      await timeout(6000);
      console.log("timeout");
      dataArr = [];
    }
  }
    reader.close(function(err) {
      if (err) throw err;
    });
});

reader.nextline()在第370行之后停止工作,即使while循环正在执行。但是当我移动await外面的代码似乎工作正常。为什么会这样。

1 个答案:

答案 0 :(得分:2)

您正在将承诺(async/await)与回调(reader.nextLine())混合,这会导致您的问题。

具体来说,你过早地调用reader.close(),因为它在读取所有行之前被调用;获得读取的370行可能适合于在文件关闭之前从文件中读取的缓冲区。

一个解决方案是让读取基于承诺的下一行,例如:

const getNextLine = async reader => {
  return new Promise((resolve, reject) => {
    reader.nextLine(function(err, line) {
      if (err) return reject(err);
      resolve(line);
    });
  });
}

lineReader.open(filename, async function(err, reader) {
  if (err) throw err;
  var dataArr = [];
  while (reader.hasNextLine()) {
    let line = await getNextLine(reader);
    dataArr.push(csv_parse(line, headers));
    console.log(dataArr.length);
    if (dataArr.length == 3000) {
      console.log(JSON.stringify(dataArr));
      await timeout(6000);
      console.log("timeout");
      dataArr = [];
    }
  }
  reader.close(function(err) {
    if (err) throw err;
  });
});
相关问题