Вопрос

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

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

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

Это было полезно?

Решение

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

Другие советы

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

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);
});
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top