异步响应到JavaScript NodeJS中的循环 [英] asynchronous response into a loop in javascript NodeJS

查看:36
本文介绍了异步响应到JavaScript NodeJS中的循环的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

我的代码

  router.post('/payrollReport/',function(req,res,next){var usersRecord = [];models.user.findAll().then(功能(用户){for(var i = 0; i< users.length; i ++){models.sequelize.query('SELECT表单名称,COUNT(form_submits.form_id)'+'FROM form_submits'+'左联接在form.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(函数(结果){usersRecord.push(results [0]);console.log(usersRecord);});};}).catch(function(error){res.status(500).send(错误);});res.send(usersRecord);}); 

感谢您的帮助

编辑

使用forEach添加正确的代码

  router.post('/payrollReport/',function(req,res,next){var usersRecord = [];models.user.findAll().then(功能(用户){async.forEachOf(users,function iterator(user,index,callback){models.sequelize.query('SELECT表单名称,COUNT(form_submits.form_id)'+'FROM form_submits'+'左联接在form.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(函数(结果){结果[0] .unshift(用户);usersRecord.push(results [0]);打回来();});},函数(错误){如果(err)console.error(err.message);res.send(usersRecord);});}).catch(function(error){res.status(500).send(错误);});}); 

解决方案

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

此处

I have a NodeJS API using Express 4. I am using sequelize to connect to the database and I invoke one query many times. I want accumulate the results into an Array. The problem is that res.send doesn't wait for the loop to end to send the answer.

my code

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

thanks for your help

EDIT

Add the correct code using 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);
    });  

});

解决方案

Since node.js works asynchronously, your res.send(usersRecord); command is executed before all iterations are done. You can use async.foreach for this, it will allow you to run your send only after all iterations are done.

There's a great tutorial about it here

这篇关于异步响应到JavaScript NodeJS中的循环的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆