mysql - 使用 mysql 和 node.js 更新 foreach 外部的变量值

标签 mysql node.js asynchronous

我在理解 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/

相关文章:

php - 在两台计算机之间建立连接,中间有一个网站

javascript - 我们可以有一个调度程序,您可以异步添加要执行的操作,但将按该顺序同步执行吗?

asp.net - UpdatePanel 与 ASP.NET Repeater 和 Checkbox 同步回发问题

ios - 我应该把这段应该在后台完成的代码放在哪里?

php - 使用 MySQLi 插入数据 - 我应该使用准备好的语句吗?

php - 如果表中不存在 userID,则添加 mysql 行

mysql - Sequelize Node JS 中的时区问题

javascript - ': :' 是什么意思?

node.js - Readline 争论或如何捕获关键事件并在框内绘制

javascript - 我如何在 AngularJS 的索引页面上使用来自 Node.js 的信息