我有一系列查询
var array = [ 'UPDATE EVALUATION SET mark = "16" WHERE id_eval = "21" AND id_usr = "125"',
'UPDATE EVALUATION SET mark = "9" WHERE id_eval = "22" AND id_usr = "125"',
'UPDATE EVALUATION SET mark = "8" WHERE id_eval = "34" AND id_usr = "125"'
]
然而,当我尝试使用异步同时执行所有操作时,我的网页显示Waiting for localhost...
并且它会一直保持加载状态。我做错了什么?
async.forEach(array, function(query, callback) {
connection.query(query, function(err, rows, fields) {
if(err) {
return console.error(err);
}
callback();
});
}, function(err){
if(err) {
return console.log(err);
}
});
答案 0 :(得分:1)
请确保在调用forEach
回调后返回响应:
async.forEach(array, function(query, callback) {
connection.query(query, function(err, rows, fields) {
if(err) {
console.error(err);
}
callback();
});
}, function(err){
if(err) {
console.log(err);
}
res.redirect('/next-page');
});
这样,重定向将仅在所有查询结束时发生。
您应该验证的一些事项:
res.end()
或res.redirect()
或类似内容。query
方法实际上只需要2个参数:查询和回调,而不是介于两者之间的任何内容(例如查询参数)。答案 1 :(得分:0)
通常你有一个像这样的请求处理程序:
const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('Hello World\n');
});
您的浏览器在调用res.end
之前保持连接!
在您的环境中,它应该看起来像
const server = http.createServer((req, res) => {
// ...
async.forEach(array, function(query, callback){
connection.query(query, function(err, rows, fields) {
// you may do some work here but leave it *alyways* via callback!
callback(err);
});
}, function(err){
if(err){ // this may be errors from above
return console.log(err);
}
// Exit here !
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('All done.\n');
});
});
......或者说有点清洁
function doSomeDatabaseUpdates(onFinished) {
var array = [...];
async.forEach(array, function(query, callback){
connection.query(query, function(err, rows, fields) {
// you may do some work here but leave it *alyways* via callback!
callback(err);
});
},
function IGetCalledAfterAboveCallbackWereExecuted(err){
if(err){ // this may be errors from above
return console.log(err);
}
// Exit here !
onFinished();
});
}
const server = http.createServer((req, res) => {
// ... do some work
if (doSomeUpdated === true) {
doSomeDatabaseUpdates(function calledAfterUpdates() {
res.end("updates something");
});
} else {
res.end("nothing to do");
}
});