一旦CSV完成阅读,如何解决承诺?

我正在使用这里find的'fast-csv'模块( https://www.npmjs.org/package/fast-csv ),但是我愿意改变它。 我试过promised-csv( https://www.npmjs.org/package/promised-csv ),但是我无法把头绕在里面。 我也使用q( https://www.npmjs.org/package/q )。

这是一个长期承诺的function链的一部分,所以我只会打扰你这个和那个之后立即。

var csvRows = []; var parseCSV = function(){ var d = q.defer(); csv .fromPath(school+'_export1.csv') .on('data', function(data){ csvRows.push(data); }) .on('end', function(){ done = true; d.resolve(); }); return d.promise; } var updateSchedule = function(){ var d = q.defer(); console.log(csvRows); // csvRows.forEach(function(row){ // console.log(row); // connection.query('INSERT INTO schedule SET section_id = "'+data[0]+'", student_id = "'+data[1]+'", course_number = "'+data[2]+'", period = "'+data[3]+'", teacher_id = "'+data[4]+'", school_id = "'+school_id+'"', function(err, rows){ // if(err){ // console.log(err); // d.reject(); // } // }); // }); d.resolve(); return d.promise; } 

当我从.on('data')方法调用console.log(csvRows)时,它会按照它应该的方式单独logging每一行。 如果我然后从.on('end')方法console.log(csvRows),它将立即logging整个数组。 完善。 然后我试图解决在这里的承诺,但是当它移动到下一个function,我尝试console.log(csvRows)我得到一个空的数组。 所以我得到的承诺是不是真的解决,但我不太清楚如何解决它。 我真的很感谢你的帮助!

编辑:这是我的承诺链:

 deleteRows() .then(function(){ parseCSV(); }) .then(function(){ updateSchedule(); }) .done(); 

你需要等待承诺解决,你需要传递承诺中的数据,尝试这样的事情:

  var parseCSV = function(){ var d = q.defer(); csv .fromPath(school+'_export1.csv') .on('data', function(data){ csvRows.push(data); }) .on('end', function(){ d.resolve(csvRows); }); return d.promise; } var updateSchedule = function(){ parseCSV.then(function(rows){ //TODO, your code here }); } 

编辑:

尝试链接你的承诺,像这样:

 deleteRows() .then(function(){ return parseCSV(); }) .then(function(rows){ //TODO, whatever you need to do with rows return updateSchedule(rows); }) .done(); 

但我更喜欢这样的东西:

 deleteRows() .then(function(){ return parseCSV().then(function(rows){ //Todo your code here }); }).done(); 

承诺要小心,不要滥用。