我在理解 Node.js 中的异步回调时遇到问题
这是我的代码:
//userRole is a session value
//capabilities is an array of strings
var check = 0;
capabilities.forEach((index)=> {
connection.query("SELECT * FROM doc_users_role WHERE name = ?
AND " + index + "= 1 ",[userRole], function(err, rows){
if(rows.length == 1){
check++;}
});
})
console.log(check) //returns always 0;
如何以异步方式解决这个问题?我需要从 foreach 中的回调(connection.query 回调)中更新变量检查...谢谢!
最佳答案
这可以使用异步模块来实现,如下所示。由于 NodeJS 的非阻塞特性,除非另有说明,否则它将继续执行而不等待循环完成。这就是回调发挥作用的地方。forEachSeries 循环的每次迭代都将执行,然后执行回调来告诉循环它已准备好进行下一次迭代。这样每次迭代都是依次完成的。然后,控制台日志被放置在最后一个 block 中,这是在 forEachSeries 完成时将执行的代码片段,因此确保显示变量的正确值。我希望这能回答您的问题。
async.forEachSeries(capabilities, function (index, forEachCallback){
connection.query("SELECT * FROM doc_users_role WHERE name = ?
AND " + index + "= 1 ",[userRole], function(err, rows){
if(rows.length == 1){
check++;
forEachCallback();
}
else{
forEachCallback();
}
});
}, function(err) {
if ( err ){
// catch error and do something
return;
}
console.log( check );
});
关于mysql - 使用 mysql 和 node.js 更新 foreach 外部的变量值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41766919/