javascript - CSV 阅读完毕后,我该如何解决 promise ?

标签 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 )。

这是一长串已 promise 功能的一部分,所以我只会用这个和紧接着的一个来打扰你。

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),它会立即记录整个数组。完美的。然后我尝试在这里解决 promise ,但是当它移动到下一个函数并且我尝试 console.log(csvRows) 我得到一个空数组。所以我知道 promise 实际上并没有解决,但我不太确定如何解决它。非常感谢您的帮助!

编辑:这是我的 promise 链:

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

最佳答案

你需要等待 promise 得到解决,你需要在 promise 中传递数据, 尝试这样的事情:

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

编辑:

尝试像这样链接你的 promise :

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

小心 promise ,尽量不要滥用它们。

关于javascript - CSV 阅读完毕后,我该如何解决 promise ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27045016/

相关文章:

javascript - 从 URL 获取图像作为缓冲区

node.js - 使用 bitbucket 在 Azure 上部署 Angular2 项目时出现 package.json 错误

java - 读取 CSV 并将字符串转换为 double

php - 从目录中读取 *.csv 文件并显示每个文件的内容失败

javascript - 是否可以在 Javascript 中将未声明的变量作为参数传递?

javascript - $.getJSON 和 google fonts API 在 jQuery 版本高于 1.4.4 的 Internet Explorer 中停止工作

javascript - MeshLab Quadric Edge Collapse Decimation 在 JavaScript、PHP 或 Python 中保留纹理?

node.js - 发送到 S3 的 AWS 访问 ID 与我在 Node AWS-SDK 中指定的不同

javascript - Angularjs:数组分配问题

csv - 将 CSV 附件导入谷歌表格