【问题标题】:Callback isn't called as many times as expected回调没有像预期的那样被调用多次
【发布时间】:2019-05-23 06:13:05
【问题描述】:

员工网页在循环中对 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);
    }
    });
});

【问题讨论】:

  • 这段代码对我来说很好用(除了其他方面的一些缺陷),你确定它不应该是var i = 0而不是var i = 1
  • 尝试在循环中添加console.log 语句(打印strJSON),看看它执行的次数是否与您想象的一样多。还要在 UpdateTeamArr 顶部添加一个,以确认它实际调用的频率。最后请注意,您似乎在循环末尾有一个额外的大括号 - 可能是复制粘贴错误。
  • 不是在 JavaScript 中的 for 循环中调用异步函数的副本 – @ponury-koste。那是关于关闭,而这里是执行次数。
  • @adam - var i = 1 是故意的

标签: javascript node.js ajax


【解决方案1】:

啊,你在这里使用var 来代替xmlhttp。一个 var 不是块范围的,它是被提升的——这意味着这个单一的 var 被所有对 UpdateTeamArr 的调用使用。我相信您正在调用该函数 N 次,但每次都是最后一个响应。

对该理论的一个简单测试就是在该行将var 更改为let

【讨论】:

  • 非常感谢@Elliot Nelson。这样就解决了。
【解决方案2】:

您为什么不尝试通过创建一个 uniq JSONArray 来仅对服务器执行一个请求,该数组包含一个包含“deptSelect”内所有员工 ID 的列表?

通过这种方式,您发送的响应中还包含一个包含员工其他属性的列表,采用另一种 JSONArray 格式,您可以在 UpdateTeamArr 函数中进行迭代

【讨论】:

  • 好建议@PabloQ。我仍然想知道为什么回调没有执行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-02
  • 1970-01-01
  • 2023-01-01
  • 2018-08-04
  • 1970-01-01
  • 2016-06-19
相关资源
最近更新 更多