【发布时间】:2017-12-23 18:32:40
【问题描述】:
我通过 post 请求调用 getLogs() 并从数据库中获取 LogFileID(filename) 列表,然后通过调用 _getLogFileUrls 传递此 LogFileID 以执行附加请求,这为我提供了该 ID 的签名 URL 作为响应。我将它们一一推送到一个全局数组中,并将其作为结束响应返回。
我知道使用 setTimeout 是不正确的,但问题没有使用,它每次都会给我一个不同的结果到数组中。我能做些什么来解决这个问题?如何更正此代码,以便仅在将签名的 url 存储到全局数组中时循环迭代到下一个。
function _getLogFileUrls(logFileId, callback){
var request = require('request'),
config = require('../../config.js');
var fileParams = {
fileName: 'xyzdirectory/' + logFileId
};
request.post({
url: config.filesServiceUrl + 'get-logfile-urls',
json: fileParams
},function(error, response, body) {
if (!error && response.statusCode === 200) {
callback(body);
} else {
res.status(400).send('Error requesting file service for logs:');
}
}).on('error', function(err) {
console.log('File service error for Logs: ' + err);
});
}
function getLogs(req, res){
if(!req.body.id){
return res.status(400).send('Please check the params!');
}
var date;
if(req.body.date){
date = req.body.date;
} else {
date = new Date().toISOString().slice(0,10);
}
var sqlQuery = "SELECT `LogFileID` FROM `logs_data` WHERE `EmpID` = '" + req.body.id + "' AND DATE(`Timestamp`) = '" + date + "'",
resArray= [];
hitThisQueryForMe(sqlQuery, res, function(rows){
if(!rows.length) res.json(rows);
_.each(rows, function(item){
console.log('item: ' + item.LogFileID);
_getLogFileUrls(item.LogFileID, function(response){
resArray.push(response);
});
});
setTimeout(function(){
res.send(resArray);
resArray = [];
}, 4000);
});
}
【问题讨论】:
-
类似于Callback after all asynchronous forEach callbacks are completed,答案涵盖了在多次请求后运行“最终处理程序”的不同方式
标签: javascript node.js asynccallback