симуляция синхронного запроса XmlHttpRequest - PullRequest
1 голос
/ 27 ноября 2009

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

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

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

Ответы [ 2 ]

2 голосов
/ 08 февраля 2010

Это правда, вы не хотите использовать 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; });
0 голосов
/ 27 ноября 2009

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

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);
});
...