2017-06-22 3 views
-1

サーバーは、別ファイルのすべてのデータをhttp getに応答する必要があります。ここでは、CSVパーサーを使用しています。要求と応答を伴うjavascriptコールバック関数

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パーサを読み終えた後、すべてのデータを送信するためのより良い方法はありますか?

+1

はい、彼INT、例えば、非同期のものが終了する前に結果を送信しません:result配列は4(ループの繰り返し回数)での長さまで待機以下のコードを、参照してください。 'end'イベントです。 –

+1

最終的なコールバック( 'end'コールバック)の中で' res.send' **を呼び出します。理由についてはリンクされた質問の回答を参照してください。 –

+0

Settimeoutは間違いなく悪いアプローチです。 'async'ライブラリを見て、あなたの人生を楽にしてください。 –

答えて

0

すべてのデータがある場合にのみ応答を送信します。

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) 
     } 
    }) 
    } 
} 
+0

私はres.send()をforループに入れることができますか? – Deidara

+0

ああ、申し訳ありません。すべての反復が完了した場合にのみ結果を送信する必要があります。 – smarx

+0

更新されたコードを参照してください。 – smarx

関連する問題