异步响应到JavaScript NodeJS中的循环 [英] asynchronous response into a loop in 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屋!