Получить массив из вложенного запроса и цикла foreach в nodejs - PullRequest
0 голосов
/ 24 июня 2018

Я делаю вложенный запрос, и его результаты зацикливаются, чтобы получить из него нужные данные Код:

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

я хочу, чтобы запросы отображали данные в консоли

Ответы [ 3 ]

0 голосов
/ 24 июня 2018

Во-первых, убедитесь, что вы используете let вместо var, поскольку это избавит вас от переменных цикла, доступных вне цикла.

Поскольку вы запускаете асинхронную функцию (db.query) вцикл, ваш console.log(queries) фактически завершается работой до того, как завершится какой-либо из db.queries и переместится в массив запросов.

Вы хотите выполнить все запросы db параллельно. Promise.all делает это возможным, как и несколько библиотек обещаний.Вы хотите написать команду, чтобы после завершения всех запросов console.log.

0 голосов
/ 26 июня 2018

Проблема с вашей функцией isCheck.forEach. Вы должны обрабатывать это асинхронно. Вы можете использовать каждый из библиотеки 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)
    })
})
0 голосов
/ 24 июня 2018

Поместите console.log сразу после цикла updateCheckOut.forEach.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...