Javascript,回调函数中的变量范围外?

时间:2014-08-13 07:48:21

标签: javascript node.js callback scope

大家。

我对回调函数有疑问 - 变量',

的范围

我想使用' i in for循环'回调函数User_UidSearch',

但我无法使用它。

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


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);
        }
    });
}

&#34; console.log(i);&#34;

重新检查,这是错误的。 - &GT;输出是&#34;未定义&#34;所有。

undefined是&#34; console.log(result [i]);&#34;

但是&#34;我&#34;保持&#39; 2&#39;如果results.length为2,则控制台两次。

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

但我怎样才能解决它&#34;我&#34;是0和1。

2 个答案:

答案 0 :(得分:3)

您的问题可能已经解决,但我还是要添加这些要点,以便其他人知道正确的方法。

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

在某些情况下使用闭包很好,但不是这个。请阅读Practical uses of closures

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

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

    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);
            }
        });
    }
    

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

答案 1 :(得分:1)

您正在处理closures,请按以下方式重写您的代码:

...
(function(id) {
    User_UidSearch(results[id].employee, function (user) {
        console.log(id);
        // results[i]['email'] = user.email;
    });
})(i);

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