XMLHttpRequest отправляет один за другим

#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 .

Если у вас есть полный контроль над сервером, я бы сначала попытался как-то убедить его принимать и обрабатывать быстрые последовательные запросы; Я нахожу немного странным, что сервер не может справиться с этим.