ori*_*iaj 3 javascript asynchronous node.js 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);
});
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助
编辑
使用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);
});
});
Run Code Online (Sandbox Code Playgroud)
由于node.js异步工作,res.send(usersRecord);因此在完成所有迭代之前执行命令.您可以使用async.foreach,它将允许您在所有迭代完成后运行您的发送.
有一个关于它的伟大的教程在这里
| 归档时间: |
|
| 查看次数: |
2520 次 |
| 最近记录: |