首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从nodejs中的嵌套查询和foreach循环中获取数组

从nodejs中的嵌套查询和foreach循环中获取数组
EN

Stack Overflow用户
提问于 2018-06-25 01:39:35
回答 3查看 946关注 0票数 0

我正在做嵌套查询,它的结果被循环以从it Code中获得所需的数据:

代码语言:javascript
复制
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 
})

我希望查询在控制台中显示数据

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-06-27 01:22:12

您的isCheck.forEach函数有问题。您需要异步处理它。您可以使用each from async 库。

代码语言:javascript
复制
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)
    })
})

票数 0
EN

Stack Overflow用户

发布于 2018-06-25 01:50:55

将console.log紧跟在updateCheckOut.forEach循环之后。

票数 0
EN

Stack Overflow用户

发布于 2018-06-25 02:02:43

首先,确保使用let而不是var,因为它可以避免循环变量在循环之外可用。

因为您在循环中运行异步函数(db.query),所以您的console.log(queries)实际上会在任何db.queries完成并推送到查询数组之前运行。

您希望并行运行所有数据库查询。Promise.all使之成为可能,几个promise库也是如此。您希望编写该命令,以便在所有查询完成后执行console.log

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51012420

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档