异步响应到javascript NodeJS中的循环

时间:2016-01-04 17:02:55

标签: javascript node.js asynchronous express

我有一个使用Express 4的NodeJS API。我使用sequelize连接到数据库,我多次调用一个查询。我想将结果累积到一个数组中。问题是res.send不会等待循环结束以发送答案。

我的代码

router.post('/payrollReport/', function(req, res, next) {
    var usersRecord = [];
    models.user.findAll(
    ).then(function(users) {
      for (var i = 0; i < users.length; i++) {
            models.sequelize.query('SELECT forms.name, COUNT(form_submits.form_id)  ' +
                    'FROM form_submits ' + 
                    'LEFT JOIN forms ON forms.form_id = form_submits.form_id ' +
                    'WHERE form_submits.user_id = ' + users[i].user_id +
                    'AND date("form_submits"."createdAt") >=' + req.body.begin +
                    'AND date("form_submits"."createdAt") <=' + req.body.end +
                    " GROUP BY forms.name")
             .then(function(results){
                 usersRecord.push(results[0]);
                 console.log(usersRecord);
            });      
      };
    }).catch(function(error) {
      res.status(500).send(error);
    });  
    res.send(usersRecord);
});

感谢您的帮助

修改

使用forEach

添加正确的代码
router.post('/payrollReport/', function(req, res, next) {
    var usersRecord = [];
    models.user.findAll(
    ).then(function(users) {
       async.forEachOf(users, function iterator(user, index, callback) {
            models.sequelize.query('SELECT forms.name, COUNT(form_submits.form_id)  ' +
                    'FROM form_submits ' + 
                    'LEFT JOIN forms ON forms.form_id = form_submits.form_id ' +
                    'WHERE form_submits.user_id = ' + user.user_id +
                    'AND date("form_submits"."createdAt") >=' + req.body.begin +
                    'AND date("form_submits"."createdAt") <=' + req.body.end +
                    " GROUP BY forms.name")
             .then(function(results){
                 results[0].unshift(user); 
                 usersRecord.push(results[0]);
                 callback();
            });   

         }, function (err) {
          if (err) console.error(err.message);
          res.send(usersRecord);
       });


    }).catch(function(error) {
      res.status(500).send(error);
    });  

});

1 个答案:

答案 0 :(得分:5)

由于node.js异步工作,因此在完成所有迭代之前执行res.send(usersRecord);命令。您可以使用async.foreach进行此操作,它将允许您在完成所有迭代后仅运行发送。

有一个很棒的教程here