имитация синхронного запроса XmlHttpRequest

Я прочитал некоторые другие связанные вопросы (Шаблон для упаковки асинхронной функции JavaScript, чтобы сделать ее синхронной и Сделать асинхронное событие синхронно в JavaScript, и их может быть больше), но я просто хочу быть уверенным, что исчерпал все возможности.

Возможно ли «преобразовать» асинхронный запрос XmlHttpRequest в квазисинхронный, используя либо setInterval, либо setTimeout?

Идея состоит в том, что при успешном выполнении запроса Ajax будет установлена ​​переменная, которая будет сигналом для цикла while (который вызвал либо setInterval, либо setTimeout, и функцию обратного вызова, если необходимо) для выхода. Или я в корне неправильно понимаю возможности (или ограничения?) SetInterval и / или setTimeout?


person Dexygen    schedule 27.11.2009    source источник
comment
В этом нет смысла. setInterval и setTimeout сами по себе вводят асинхронность, как это сделает ваш вызов XHR синхронным?   -  person jpsimons    schedule 27.11.2009
comment
Конечно, это имеет смысл, если учесть, что в самом конце я спрашиваю, действительно ли я неправильно понимаю возможности (или ограничения?) SetInterval и / или setTimeout ?, и, поскольку ваш комментарий помогает ответить на этот вопрос, я предлагаю вам оставить ответ, а не комментарий.   -  person Dexygen    schedule 28.11.2009


Ответы (2)


Это правда, вы не хотите использовать setInterval и setTimeout так, как вы описали. Что вам действительно нужно, так это просто освоиться с вложенными функциями, в которых вы можете писать более или менее синхронно.

Например:

XHR.get(your_data, function()
   {
      //what you would have done "synchronously"
   });

Хотя вы можете использовать setInterval и / или setTimeout (с вызовами снова setTimeout в теле функции) для «опроса» кода успеха, этот подход значительно уступает простой обработке обратного вызова в первую очередь вместо его опроса. Он вызывает задержку, убегает от процессора и не масштабируется по нескольким запросам XHR, чтобы назвать несколько недостатков.

XHR вызовет вашу функцию, когда она завершится, нет смысла запускать функцию с вопросом: «Мы еще закончили? в это время. С другой стороны, если есть какое-то периодическое поведение, которое вы хотите БЛОКИРОВАТЬ до тех пор, пока не вернется ответ (например, фрагмент анимации, который требует, чтобы эти данные запускались), вполне допустимо заключить код блокировки в оператор if:

var tick = window.setTimeout(tock, 20);
var tock = function()
{
   if (response_done)
   {
      // dependent code
   }
   tick = window.setTimeout(tock, 20);
}
XHR.get(your_data, function() { /*Handle response*/ response_done = true; });
person Plynx    schedule 08.02.2010
comment
Спасибо! Я уже давно пользуюсь этим сайтом; Я подумал, что пора начать отдавать то, что я могу ^ _ ^ - person Plynx; 09.02.2010

Если я правильно понимаю ваш вопрос, вы можете добиться аналогичного эффекта, используя следующий код:

var computationInterval =
    window.setInterval(function() {
        // do a computation cycle, as if you're in the body of a while loop
    }, 100);

$.get('http://example.com/areWeThereYet', function() {
    // break the intervals (the pseudo-cycle)
    window.clearInterval(computationInterval);
});
person Alex Gyoshev    schedule 27.11.2009