关于node.js:Javascript,回调函数中的变量范围外?

Javascript, outside variable scope in callback function?

大家。

我有一个关于'回调函数 - 变量范围'的问题,

我想用'i in for loop'来'回调函数User_UidSearch',

但我不能用它。

(我希望解决方案不使用全局变量。)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Task_TidSearchExecution = function(tid, callback) {
    var sql ="SELECT * FROM execution WHERE task = '" + tid +"'";
    dbclient.query(sql, function (err, results) {
        if (err || results.length <= 0)
            callback(false);
        else {
            console.log(results.length);
            for (var i = 0 ; i < results.length ; i++) {
                User_UidSearch(results[i].employee, function (user) {
                    console.log(i);
                    // results[i]['email'] = user.email;
                });
            }

            callback(results);
        }
    });
}

"console.log(i);"

重新检查,这是错误的。 - >输出是"未定义"的。

undefined是"console.log(result [i]);"

但是如果results.length是2,那么"i"将保持'2'控制台两次。

我知道becuz for循环结束然后执行User_UidSearch,

但我怎么能解决它"我"是0和1。


您的问题可能会得到解决,但让我仍然添加这些要点,以便其他人知道正确的方法。

首先,在循环中调用异步函数不是一个好习惯。 这将导致意想不到的结果。

在某些情况下使用闭包很好,但不是这个。 请阅读此处了解封盖的实际用途。

你采取的方法有几个问题,

  • 如果结果数组太长,则会有太多的打开请求。
  • 在调用User_UidSearch的单个回调之前,将调用callback(results)
  • 在您的情况下,您应该使用这样的递归函数:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    var len = results.length;
    var count = 0;
    function my_func() {
        User_UidSearch(results[count].employee, function (user) {
            console.log(count);
            // results[count]['email'] = user.email;

            count += 1;
            if (count < len) {
                my_func();
            } else {
                callback(results);
            }
        });
    }

    如果有兴趣详细解释不同的控制流程,请阅读此内容。


    您正在处理闭包,重写您的代码如下:

    1
    2
    3
    4
    5
    6
    7
    ...
    (function(id) {
        User_UidSearch(results[id].employee, function (user) {
            console.log(id);
            // results[i]['email'] = user.email;
        });
    })(i);

    即 将函数包装为取消绑定i