2014-11-20 132 views
1

我在这里使用'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)。一旦CSV完成阅读,我如何解决承诺?

这是一个承诺功能的长链的一部分,所以我只会打扰你这一个和紧随其后。

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; 
 
}

当我CONSOLE.LOG(csvRows)从。对( '数据')的方法,它单独地记录每一行,因为它应该。如果我然后从.on('end')方法console.log(csvRows),它会立即记录整个数组。完善。然后我尝试解决这里的承诺,但是当它移动到下一个函数时,我尝试console.log(csvRows),我得到一个空数组。所以我得到承诺并没有真正解决,但我不太清楚如何解决它。我真的很感谢你的帮助!

编辑:这是我的承诺链:

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

回答

3

你需要等待承诺得到解决,你需要通过在承诺的数据, 尝试这样的事情:

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(); 

小心的承诺,尽量不要虐待他们的。

+0

我有点困惑。对不起,我对承诺是新的,“完成”来自哪里?我只是将我的承诺链添加到原始文章中。之前调用函数而不是下一个函数有什么不同? – user3630824 2014-11-20 17:00:04

+1

我刚刚复制粘贴了自己的代码,没有相关性,我已经删除了它 – 2014-11-20 17:01:39

+0

OH!哈!我知道从哪里来的现在哈哈,对不起,对不起,谢谢! – user3630824 2014-11-20 17:02:53