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

Javascript, outside variable scope in callback function?

本文关键字:变量 范围 回调 函数 Javascript      更新时间:2023-09-26

everyone.

我对"回调函数 - 变量范围"有问题,

我想使用"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);
        }
    });
}

"控制台.log(i(;">

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

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

但是"i"保持"2"控制台两次,如果结果长度为2。

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

但是我怎么能喜欢它"i"是 0 和 1。

你的问题可能已经解决了,但让我仍然补充这些要点,以便其他人知道正确的方法。

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

在某些情况下使用闭包是可以的,但不是这种情况。阅读此处了解闭包的实际用途。

您采取的方法存在几个问题,

  1. 如果结果数组太长,则会有太多打开的请求。
  2. 在调用 User_UidSearch 的单个回调之前,将调用callback(results)

在您的情况下,您应该像这样使用递归函数:

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

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

您正在处理闭包,请按如下方式重写代码:

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

即包装您的函数以解绑i