【问题标题】:How can I resolve a promise once a CSV is done reading?读取 CSV 文件后如何解决承诺?
【发布时间】:2023-04-09 21:34:01
【问题描述】:

我正在使用此处的“fast-csv”模块 (https://www.npmjs.org/package/fast-csv),但我愿意更改它。我尝试了 promise-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();

【问题讨论】:

    标签: javascript node.js csv promise


    【解决方案1】:

    你需要等待承诺得到解决,你需要在承诺中传递数据, 试试这样的:

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

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

    【讨论】:

    • 我有点困惑。抱歉,我是 Promise 的新手。“done”从何而来?我刚刚将我的 Promise 链添加到我的原始帖子中。之前调用函数而不是在下一个函数中调用函数有什么区别?
    • 我只是复制粘贴了你自己的代码,与它无关,我已经删除了它
    • 它应该类似于 .then(function(rows){return parseCSV(rows)}, what does done contains? 记得做一个解析并像 d.resolve(csvRows );
    • 在您返回承诺的每个链中,它可能处于已解决、未解决和拒绝的状态,一旦您解决了承诺,您就可以按照您的方式在解决本身中传递数据将能够在适当的 'then' 中得到它(这是当你解决你的承诺时被解雇的偶数),只是小心不要过度承诺你可能会陷入反模式
    猜你喜欢
    • 2017-06-13
    • 2016-04-05
    • 2020-09-07
    • 1970-01-01
    • 2017-02-18
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    相关资源
    最近更新 更多