我正在做嵌套查询,它的结果被循环以从it Code中获得所需的数据:
db.query("select * from user where CheckIn IS NULL order by checkIn", function (err, isCheck) {
if (!_.size(isCheck))
return db.end()
var queries = []
isCheck.forEach(function (item, i, data) {
var CheckIn = data[i].CheckIn
var id = data[i].id
db.query("select * from user where checkIn > ? and date(checkIn) = date(?) order by checkIn limit 1", [checkIn, checkIn], function (err, updateCheck) {
if(!_.size(updateCheck))
return
updateCheckOut.forEach(function (item, j, data2) {
var difftm = moment(data2[j].checkIn).diff(moment(checkIn), 'minutes')
if(difftm == 0)
var updatedNewCheckOut = data2[j].checkIn
if(difftm >= 1)
var updatedNewCheckOut = 'SUBDATE('+ data2[j].checkIn +', INTERVAL 1 MINUTE)'
if(difftm > 600)
var updatedNewCheckOut = 'DATE_ADD('+ data2[j].checkIn + ', INTERVAL 10 HOUR)'
queries.push([updatedNewCheckOut, 1, id])
})
})
})
console.log(queries) // null array
})
我希望查询在控制台中显示数据
发布于 2018-06-27 01:22:12
您的isCheck.forEach函数有问题。您需要异步处理它。您可以使用each from async 库。
db.query("select * from user where CheckIn IS NULL order by checkIn", function (err, data) {
if (!_.size(data)){
return db.end()
}
var queries = []
async.each(data, function (item, done) {
var CheckIn = item.CheckIn
var id = item.id
db.query("select * from user where checkIn > ? and date(checkIn) = date(?) order by checkIn limit 1", [checkIn, checkIn], function (err, updateCheck) {
if (!_.size(updateCheck)) return done()
updateCheckOut.forEach(function (item, j, data2) {
var difftm = moment(data2[j].checkIn).diff(moment(checkIn), 'minutes')
if (difftm == 0)
var updatedNewCheckOut = data2[j].checkIn
if (difftm >= 1)
var updatedNewCheckOut = 'SUBDATE(' + data2[j].checkIn + ', INTERVAL 1 MINUTE)'
if (difftm > 600)
var updatedNewCheckOut = 'DATE_ADD(' + data2[j].checkIn + ', INTERVAL 10 HOUR)'
queries.push([updatedNewCheckOut, 1, id])
});
done()
})
}, function(er){
console.log("everything `enter code here`has completed")
console.log("Err: ", er)
console.log("Queries: ", queries)
})
})
发布于 2018-06-25 01:50:55
将console.log紧跟在updateCheckOut.forEach循环之后。
发布于 2018-06-25 02:02:43
首先,确保使用let
而不是var
,因为它可以避免循环变量在循环之外可用。
因为您在循环中运行异步函数(db.query),所以您的console.log(queries)
实际上会在任何db.queries完成并推送到查询数组之前运行。
您希望并行运行所有数据库查询。Promise.all使之成为可能,几个promise库也是如此。您希望编写该命令,以便在所有查询完成后执行console.log
。
https://stackoverflow.com/questions/51012420
复制相似问题