2014-11-20 124 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