javascript - 回调的调用次数不如预期

标签 javascript node.js ajax

员工网页在循环中对 node.js Web 服务器进行 Ajax 调用。给定的代码。所有数据值都是正确的。我希望回调 UpdateTeamArr 被调用 n 次,其中 n 等于循环最大值 - document.getElementById("deptSelect").options.length。但它只被调用一次。感谢您的努力和支持。

客户端代码:

for (var i = 1; i < document.getElementById("deptSelect").options.length; i++) {
    var objJSON = {
        "deptid": document.getElementById("deptSelect").options[i].dataset.id,
        "empid": selectedEmployeeId
    }   
    var strJSON = JSON.stringify(objJSON);
    var xmlhttp = new XMLHttpRequest(); 

    xmlhttp.open("post", "../../GetEmployeesTeams", true);
    xmlhttp.onreadystatechange = function() {
        if(xmlhttp.readyState === XMLHttpRequest.DONE && xmlhttp.status === 200) {
            UpdateTeamArr(xmlhttp);
        }
    }
    xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
    xmlhttp.send("strJSON=" + strJSON);     
    }
}
function UpdateTeamArr(xmlhttp) {
}

服务器代码:

app.post('/GetEmployeesTeams', function(req, res) {
var connection = mysql.createConnection({
    host     : "127.0.0.1",
    port     : 3306,
    user     : "root",
    password : "root",
    database : "lighting"
});
var strJSON = req.param('strJSON');
var objJSON = JSON.parse(strJSON);

connection.connect();
connection.query("SELECT db_teamemp.teamid, db_department.id AS deptid FROM lighting.db_teamemp, lighting.db_department, lighting.db_team WHERE db_teamemp.empid='" + 
                    objJSON.empid + "' AND db_department.id='" + objJSON.deptid + "' AND db_teamemp.teamid=db_team.id AND db_team.dept=db_department.id;", 
                    function(err, result, fields) {
    if (err)
        throw err;
    else {
        connection.end();
        res.status(200);
        return res.send(result);
    }
    });
});

最佳答案

啊,你在这里为 xmlhttp 使用了一个 var。 var 不是 block 作用域的,它是提升的——这意味着所有对 UpdateTeamArr 的调用都使用这个单一的 var。我相信您 调用了该函数 N 次,但每次都是最后一个响应。

这个理论的一个简单测试是简单地将 var 更改为 let

关于javascript - 回调的调用次数不如预期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53907368/

相关文章:

javascript - 无法在Reactjs中加载js文件

html - 使用 localhost URL 在浏览器中打开页面的 node.js 代码

javascript - Phonegap应用程序无法连接到移动设备上的数据库

php - 使用 PHP 和 MySQL 登录非常慢

Javascript for 循环 [循环不停止]

javascript - 如何在下一个上一个悬停时滑动猫头鹰旋转木马?

javascript - HTML5 canvas ctx.fillText 不会换行?

bash - 如何安装 connect 以用作 bash 的可执行文件

javascript - 如何正确结束或销毁扬声器实例而不出现 `illegal hardware instruction` 错误?

ajax - 如何使用 p :ajax to update several components in order