Как заставить программу ждать до завершения HTTP-запроса в JavaScript?

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

Есть идеи?

Спасибо заранее, Танасис

 kojiro30 дек. 2011 г., 21:54
Я действительно хотел бы, чтобы люди оставили пояснительные комментарии, когда они -1.

Ответы на вопрос(5)

Вы можете использовать объект XMLHttpRequest для отправки вашего запроса. После отправки запроса вы можете проверить свойство readyState для определения текущего состояния. У readyState будут следующие состояния.

Uninitialized - еще не начал загружатьсяЗагрузка - идет загрузкаИнтерактивный - достаточно загружен, и пользователь может взаимодействовать с нимComplete - полностью загружен

например:

xmlhttp.open("GET","somepage.xml",true);
xmlhttp.onreadystatechange = checkData;
xmlhttp.send(null);

function checkData()
{
    alert(xmlhttp.readyState);
}

надеюсь, это поможет

 FindOutIslamNow05 июл. 2018 г., 13:39
Это кажется лучше, чем ожидание или блокирование до выполнения
 chris14 мар. 2018 г., 09:25
это работает для меня, спасибо. Вот возможные состояния готовности: 0: UNSENT, 1: OPENED, 2: HEADERS_RECEIVED, 3: LOADING, 4: DONE
 Thanasis Petsas21 сент. 2010 г., 15:00
Я хочу, чтобы выполнение программы было последовательным, и я не хочу использовать обратные вызовы. Я хочу, если возможно, остановить выполнение программы на "xmlhttp.send (null);" позвоните, а затем продолжить после завершения запроса.
 Ashif Nataliya22 сент. 2010 г., 07:13
Вы можете играть со свойством readyState. Возможно, вы можете поместить его в цикл while, чтобы он не переходил к следующей строке, пока выполнение не будет завершено. Также, если вы можете предсказать время выполнения, вы можете использовать функцию setTimeOut (). Подробнее об этой функции вы можете прочитать здесь.w3schools.com/jsref/met_win_settimeout.asp

У меня похожая ситуация в игре, созданной с помощью Three.js и Google Closure. Я должен загрузить 2 ресурса, Три и Закрытие не позволяют мне сделать их синхронными.

Изначально я наивно написал следующее:

main() {

  ...
  var loaded=0;
  ...

  // Load Three geometry
  var loader = new THREE.JSONLoader();
  loader.load("x/data.three.json", function(geometry) {
    ...
    loaded++;
    });

   // Load my engine data
  goog.net.XhrIo.send("x/data.engine.json", function(e) {
    var obj = e.target.getResponseJson();
    ...
    loaded++;
    });

  // Wait for callbacks to complete
  while(loaded<2) {}

  // Initiate an animation loop
  ...
};

Цикл, ожидающий завершения обратных вызовов, никогда не заканчивается с точки зрения циклаloaded никогда не увеличивается. Проблема в том, что обратные вызовы не запускаются доmain возвращает (по крайней мере, в Chrome в любом случае).

Одним из решений может быть проверка обоих обратных вызовов, чтобы увидеть, завершено ли это последним, и они продолжают цикл анимации.

Другое решение - возможно, более прямой ответ на то, что вы спрашиваете (как ждать каждой загрузки, прежде чем инициировать другую), - заключаться в следующем:

// Load Three geometry
var loader = new THREE.JSONLoader();
loader.load("x/data.three.json", function(geometry) {
  ...

   // Load my engine data
   goog.net.XhrIo.send("x/data.engine.json", function(e) {
     var obj = e.target.getResponseJson();
     ...

     // Initiate an animation loop
     ...

    });
  });
};
 Maarten Bodewes30 дек. 2011 г., 16:09
Привет Ардженти, добро пожаловать в stackoverflow! Пожалуйста, сделайте ваши ответы как можно более четкими. Используйте фигурные скобки или оберните код, используя символ `. Если возможно, попробуйте и посмотрите, сможете ли вы запустить что-то перед публикацией. Эти вопросы также могут быть использованы в будущем, поэтому, пожалуйста, постарайтесь!
 B.F.23 дек. 2014 г., 20:41
Я нашел это: Примечание:Начиная с Gecko 30.0 (Firefox 30.0 / Thunderbird 30.0 / SeaMonkey 2.27), синхронные запросы в основном потоке устарели из-за негативных последствий для пользователя. Mozilla Dev.Network

Есть 3-й параметр дляXmlHttpRequest«sopen(), который нацелен на то, чтобы указать, что вы хотите, чтобы запрос был асинхронным (и таким образом обрабатывать ответ черезonreadystatechange обработчик).

Поэтому, если вы хотите, чтобы он был синхронным (то есть дождался ответа), просто укажите false для этого третьего аргумента. Вы также можете установить ограниченноеtimeout свойство для вашего запроса в этом случае, так как это будет блокировать страницу до получения.

Вот пример функции «все в одном» для синхронизации и асинхронности:

function httpRequest(address, reqType, asyncProc) {
  var req = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");
  if (asyncProc) { 
    req.onreadystatechange = function() { 
      if (this.readyState == 4) {
        asyncProc(this);
      } 
    };
  } else { 
    req.timeout = 4000;  // Reduce default 2mn-like timeout to 4 s if synchronous
  }
  req.open(reqType, address, !(!asyncProc));
  req.send();
  return req;
}

который вы могли бы назвать так:

var req = httpRequest("http://example.com/aPageToTestForExistence.html", "HEAD");  // In this example you don't want to GET the full page contents
alert(req.status == 200 ? "found!" : "failed");  // We didn't provided an async proc so this will be executed after request completion only
 tudor12 февр. 2015 г., 04:37
Это привело меня к асинхронной библиотеке, которая делает это чрезвычайно простым.github.com/caolan/async Не обманывайтесь упаковкой. Вы просто включаете один маленький файл JavaScript - async.js!
 Randy29 мая 2019 г., 22:17
Я впервые попробовал синхронный запрос сегодня, так как у меня была такая же потребность, как и у OP. Был удивлен, что получил жалобу (в Chrome), в которой говорится: «InvalidAccessError: не удалось выполнить« open »для« XMLHttpRequest »: синхронные запросы не должны устанавливать тайм-аут». Учитывая природу синхронного запроса, такое ограничение кажется безумным, но это было результатом. Weird!

как только страница начнет загружаться, а затем вы можете закрыть его, когда запрос завершится или ваш домен будет готов. Что я пытаюсь сказать, когда начинается загрузка страницы, запустить загрузчик. Затем страница может выполнить несколько синхронных запросов с использованием ajax, пока и если вы не получили ответ, не закрывайте закрывающий загрузчик. Получив желаемый ответ в последнем звонке, вы можете закрыть загрузчик.

 Nik21 сент. 2010 г., 15:19
@Thanasis Petsas: Пожалуйста, проверьте отредактированный пост. Надеюсь, это поможет вам.
 Thanasis Petsas21 сент. 2010 г., 14:49
Да, это именно то, что я хочу сделать ..
 Alex21 сент. 2010 г., 14:46
Вы выключены ... он спрашивает о блокировании нескольких запросов.
 Thanasis Petsas21 сент. 2010 г., 16:45
Можете ли вы опубликовать простой пример, пожалуйста?

Вы можете выполнить синхронный запрос. Пример jQuery:

$(function() {
    $.ajax({
       async: false,
       // other parameters
    });
});

Вы должны взглянуть на JQuery'sAJAX API, Я настоятельно рекомендую использовать фреймворк, такой как jQuery, для этого. Выполнение кросс-браузерного Ajax вручную - это настоящая боль!

 Alex21 сент. 2010 г., 14:44
это лучший способ! Тем не менее, многие люди думают, что JS Frameworks злые и имеют тенденцию кодировать все сами.
 Delan Azabani21 сент. 2010 г., 14:45
Алекс, это я! Я один из них! ;)
 tudor12 февр. 2015 г., 04:38
Если вам не нужна инфраструктура JS, просто используйте обычный обратный вызов XmlHttpRequest с async.waterfall () из async.jsgithub.com/caolan/async
 Thanasis Petsas21 сент. 2010 г., 14:45
Я пытался сделать это несколькими способами, используя, например, XmlHttpRequest, но я не нашел способа остановить выполнение, пока я не получу ответ ..

Ваш ответ на вопрос