#javascript #xmlhttprequest
#javascript #xmlhttprequest
Вопрос:
Как мне отправлять эти XMLHttpRequest
файлы по одному за раз? Прямо сейчас все они запускаются немедленно, и если их более шести, это блокирует сервер.
for (var i = 0; i <= document.getElementsByName("combobox")[0].value; i ) {
(function (i) {
var xhr = new XMLHttpRequest();
xhr.open("GET", "/grabdatafromeanotherpage.aspx", true);
xhr.send();
xhr.onreadystatechange = function () {
if (xhr.readyState == 4) {
document.getElementById("txtHint").innerHTML = document.getElementById("txtHint").innerHTML xhr.responseText;
}
}
})(0);
}
Комментарии:
1. изменение .open на false делает то, что я хочу, но тогда я не могу вывести обратно на экран
2. Вы можете использовать выборку с ожиданием
Ответ №1:
Просто несколько непроверенных идей, которые могут заставить гуру Javascript кричать в агонии, но эй, они не ответили:
Вероятно, вы могли бы заставить его работать с (устаревшими) синхронными вызовами, делая что-то вроде этого:
for (var i = 0; i <= document.getElementsByName("combobox")[0].value; i ) {
var xhr = new XMLHttpRequest();
xhr.open("GET", "/grabdatafromeanotherpage.aspx", false);
xhr.send(); // This will block until a request has been received, no need for a callback function
if (xhr.status == 200) {
document.getElementById("txtHint").innerHTML = document.getElementById("txtHint").innerHTML xhr.responseText;
}
}
Если вы не хотите использовать синхронные вызовы, и вы уверены, что проблема на стороне сервера (т.е. сервер не может обрабатывать столько почти одновременных запросов) вы могли бы вызвать номер запроса i 1 из обратного вызова запроса i, но это был бы очень грязный код.
Вы также можете использовать эту setTimeout()
функцию для отправки запросов с интервалами, которые может обрабатывать сервер, в этом примере 500 мс:
for (var i = 0; i <= document.getElementsByName("combobox")[0].value; i ) {
setTimeout(myXHR, 500 * i)
}
function myXHR() {
var xhr = new XMLHttpRequest();
xhr.open("GET", "/grabdatafromeanotherpage.aspx", true);
xhr.onreadystatechange = function () {
if (xhr.status == 200 amp;amp; xhr.readyState == 4) {
document.getElementById("txtHint").innerHTML = document.getElementById("txtHint").innerHTML xhr.responseText;
}
};
xhr.send();
}
но порядок поступления ответов не был бы гарантирован.
Вероятно, есть лучшие /hipper / более современные способы сделать все это с fetch
помощью / await
.
Если у вас есть полный контроль над сервером, я бы сначала попытался как-то убедить его принимать и обрабатывать быстрые последовательные запросы; Я нахожу немного странным, что сервер не может справиться с этим.