当前位置:  开发笔记 > 编程语言 > 正文

异步响应到javascript NodeJS中的循环

如何解决《异步响应到javascriptNodeJS中的循环》经验,为你挑选了1个好方法。

我有一个使用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);
    });  

});

Nir Levy.. 5

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

有一个关于它的伟大的教程在这里



1> Nir Levy..:

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

有一个关于它的伟大的教程在这里

推荐阅读
李桂平2402851397
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有