Обратный звонок не вызывается столько раз, сколько ожидалось - PullRequest
0 голосов
/ 24 декабря 2018

Веб-страница сотрудника делает Ajax-вызовы на веб-сервере node.js в цикле.Код как дано.Все значения данных верны.Я ожидаю, что обратный вызов UpdateTeamArr будет вызван n раз, где n равно циклу max - 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);
    }
    });
});

Ответы [ 2 ]

0 голосов
/ 24 декабря 2018

Ах, вы используете var здесь для xmlhttp.Var не ограничен областью блока, он поднят - это означает, что этот единственный var используется всеми вызовами UpdateTeamArr.Я полагаю, что вызывают функцию N раз, но каждый раз с последним ответом.

Простой тест этой теории - просто изменить var на let в этой строке.

0 голосов
/ 24 декабря 2018

Почему бы вам не попробовать выполнить только один запрос к серверу, создав уникальный JSONArray со списком, содержащим все идентификаторы сотрудников внутри вашего deptSelect?

Таким образом, вы отправляете ответ также ссписок, содержащий другие атрибуты для сотрудников в другом формате JSONArray, который можно перебрать в функции UpdateTeamArr

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...