サーバーは、別ファイルのすべてのデータを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パーサを読み終えた後、すべてのデータを送信するためのより良い方法はありますか?
はい、彼INT、例えば、非同期のものが終了する前に結果を送信しません:
result
配列は4(ループの繰り返し回数)での長さまで待機以下のコードを、参照してください。 'end'イベントです。 –最終的なコールバック( 'end'コールバック)の中で' res.send' **を呼び出します。理由についてはリンクされた質問の回答を参照してください。 –
Settimeoutは間違いなく悪いアプローチです。 'async'ライブラリを見て、あなたの人生を楽にしてください。 –