CSV完成阅读后如何解决承诺?

时间:2014-11-20 16:46:09

标签: javascript node.js csv promise

我正在使用此处找到的'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)。

这是一系列承诺函数的一部分,所以我只会打扰你这个和后一个。

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)时,它会按原样单独记录每一行。如果我从.on('end')方法调用console.log(csvRows),它会立即记录整个数组。完善。然后我尝试在这里解决这个问题,但当它转移到下一个函数并尝试console.log(csvRows)时,我得到一个空数组。所以我得到的承诺实际上并没有解决,但我不太清楚如何解决它。我非常感谢你的帮助!

编辑:这是我的承诺链:

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

1 个答案:

答案 0 :(得分: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();

小心承诺并尽量不要滥用它们。