У меня есть страница для отображения сообщений чата. Мне нужно обновлять тело чата каждые 30 секунд, чтобы загружать новые сообщения. Я установил интервал 30 секунд, функция работает, но не выполняет HTTP-запрос. Вот мой код
function loadmessages(){
var ids = document.getElementById("pid").value;
var request = new XMLHttpRequest();
request.open("get", '/refresh_message/'+ ids );
request.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
request.setRequestHeader("X-CSRF-TOKEN", document.querySelector('meta[name = "csrf-token"]').content);
request.onload = function(){
if (this.status == 200){
var resp = JSON.parse(this.responseText);
console.info(resp.message);
}
else{
console.info(this.status);
}
request.send(null);
}
}
loadmessages();
setInterval(function(){
loadmessages()
}, 30000);



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Последовательный отступ имеет значение. Вы помещаете request.send(null); в функцию request.onload, поэтому, конечно, он вообще никогда не отправляется. Вместо этого попробуйте поставить его снаружи:
function loadmessages() {
var ids = document.getElementById("pid").value;
var request = new XMLHttpRequest();
request.open("get", '/refresh_message/' + ids);
request.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
request.setRequestHeader("X-CSRF-TOKEN", document.querySelector('meta[name = "csrf-token"]').content);
request.onload = function() {
if (this.status == 200) {
var resp = JSON.parse(this.responseText);
console.info(resp.message);
} else {
console.info(this.status);
}
}
request.send(null);
}
Я как раз собирался напечатать это и заметил, что на экране появился 1 новый ответ. :) Я бы посоветовал вам также установить обработчик для вашего setInterval на случай, если позже вам понадобится остановить его или иным образом прервать процесс. Просто своего рода передовой опыт, поэтому сам по себе не заслуживающий ответа.
@Carnix Да, я должен был подумать об этом, спасибо за предложение.
Да моя плохая. Спасибо.