xmlhttp.onreadystatechange запускается только один раз при асинхронном вызове

#javascript #asynchronous #xmlhttprequest

#javascript #асинхронный #xmlhttprequest

Вопрос:

Вот мой js-код

 function makeAsynchronousPostHttpCall(url, params, callback) {
    var xmlHttp = new XMLHttpRequest();
    xmlHttp.open("POST", url, true); // false for synchronous request
    xmlHttp.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
    xmlHttp.send(params);
    xmlHttp.onreadystatechange = callback(xmlHttp);
    return xmlHttp.responseText;
}

function fooBar() {
    var url = foo;
    var config = bar;
    var params = "config="   config;
    var callback = (xmlHttp) => {
        console.log(xmlHttp.readyState);
        if(xmlHttp.readyState == 1){
            document.getElementById('progress').innerHTML = 'Request in Progress For '  config;
            document.getElementById('completedMessage').innerHTML = "";
        }
        if (xmlHttp.readyState == 4 amp;amp; xmlHttp.status == 200) {
            document.getElementById('progress').innerHTML = 'Request Completed For '  config;
            document.getElementById('completedMessage').innerHTML = xmlHttp.responseText;
        }
    }
    makeAsynchronousPostHttpCall(url, params, callback);

}
  

Все, что связано с запросом и ответом, работает нормально. Запрос выполнен успешно, и я получаю ожидаемый ответ. Но проблема в том, что мой обратный вызов «xmlHttp.onreadystatechange» запускается только один раз. т.е. в журнале консоли я смог найти только «1». Но тот же случай отлично работает, когда я использую синхронный вызов. Моя страница обновляется моим завершенным сообщением. Но при асинхронном вызове страница обновляется с помощью «Выполняется запрос для bar», но после завершения запроса я не вижу никаких дальнейших изменений на своей странице.

Есть ли какой-либо сбой при работе с асинхронным вызовом?

Спасибо!!

Комментарии:

1. .onreadystatechange должна быть функция — вы не устанавливаете ее как функцию… xmlHttp.onreadystatechange = () => callback(xmlHttp);

2. @JaromandaX, мне жаль, что я тебя не понимаю. Я назначил функцию var ‘callback’ и назначил ее xhr.onreadystatechange . что я делаю не так?

3. xmlHttp.onreadystatechange = callback(xmlHttp); callback(xmlHttp) немедленно вызывает и присваивает значение, возвращаемое этой функцией xmlHttp.onreadystatechange … есть разница между вызовом функции и (что вы и делаете) и ссылкой на функцию для присвоения чему угодно (что вам и нужно сделать)

4. пример var a = Math.random(); выполняется Math.random() немедленно — ничем не отличается от того, что вы делаете

5. @JaromandaX, да, это ошибка … Спасибо