带有请求和响应的javascript回调函数

时间:2017-06-22 21:33:30

标签: javascript jquery csv

服务器需要使用来自单独文件的所有数据来响应http get。这里我使用的是csv解析器。

   function sendFileData(req, res) {

      var result = []
      // Convert an csv file to Json entries
      for (var i = 0; i < 4; i++) {
        var dataArray = []
        csvFilePath = ...
        time = '"'
        value = '""'
        fs.createReadStream(csvFilePath)
         .pipe(csv({headers: ['date', 'time', 'value']}))
         .on('data', function (data) {
           date = ...
           time = ...
           value = ...
           dataArray.push('{' + date + time + value + '}')
         })
         .on('end', function () {
           var sensorData = '[' + dataArray + ']' 
           result.push(sensorData)
         })
      }
      res.send(result)
    }

由于for循环需要一些时间才能完成,结果总是[],所以我考虑添加setTimeout()和一个回调函数,但我觉得setTimeout很糟糕方法

   function sendFileData(req, res, callback) {

      var result = []
      // Convert an csv file to Json entries
      for (var i = 0; i < 4; i++) {
        var dataArray = []
        csvFilePath = ...
        time = '"'
        value = '""'
        fs.createReadStream(csvFilePath)
         .pipe(csv({headers: ['date', 'time', 'value']}))
         .on('data', function (data) {
           date = ...
           time = ...
           value = ...
           dataArray.push('{' + date + time + value + '}')
         })
         .on('end', function () {
           var sensorData = '[' + dataArray + ']' 
           result.push(sensorData)
         })
      }

    setTimeout(function () {
     callback(res, result)
    }, 1000)

}

function sendData (res, result) {
  res.send(result)
}

// calling function
sendFileData(req, res, sendData)

在csv-parser完成读取后,是否有更好的方法发送所有数据?

1 个答案:

答案 0 :(得分:0)

仅在拥有所有数据时发送回复。请参阅下面的代码,它等待result数组的长度为4(循环的迭代次数):

function sendFileData(req, res) {
  var result = []
  // Convert an csv file to Json entries
  for (var i = 0; i < 4; i++) {
    var dataArray = []
    csvFilePath = ...
    time = '"'
    value = '""'
    fs.createReadStream(csvFilePath)
     .pipe(csv({headers: ['date', 'time', 'value']}))
     .on('data', function (data) {
       date = ...
       time = ...
       value = ...
       dataArray.push('{' + date + time + value + '}')
     })
     .on('end', function () {
       var sensorData = '[' + dataArray + ']'
       result.push(sensorData)
       remaining -= 1
       if (result.length === 4) {  // all done
        res.send(result)
       } 
     })
  }
}