2009-11-27 2 views
1

Я прочитал некоторые другие связанные с ними вопросы (Pattern for wrapping an Asynchronous JavaScript function to make it synchronous & Make async event synchronous in JavaScript & может быть больше), но я просто хочу быть уверенным, чтобы исчерпать все возможности.моделирования синхронных XmlHttpRequest

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

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

+0

Это не имеет смысла. setInterval и setTimeout сами вводят асинхронность, как бы сделать синхронный вызов XHR? – jpsimons

+1

Уверен, что имеет смысл, если учесть, что в самом конце я спрашиваю: «Я принципиально неправильно понимаю возможности (или ограничения?) SetInterval и/или setTimeout?», И поскольку ваш комментарий помогает ответить на это, я предлагаю вам оставить скорее, чем комментарий. –

ответ

2

Это правда, вы не хотите использовать setInterval и SetTimeout в пути вы описано. То, что вы действительно хотите сделать, просто устраивает вложенные функции, где вы можете писать более или менее синхронно.

Например:

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

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

XHR будет вызывать вашу функцию, когда она будет завершена, не имеет смысла запускать функцию с запросом «Готовы ли мы еще? Готовы ли мы еще?» в это время. С другой стороны, если есть какое-то периодическое поведение, которое вы хотите BLOCK до тех пор, пока ответ не вернется (фрагмент анимации, который нуждается в этих данных для запуска, например), вполне приемлемо окружить блокирующий код в инструкции 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

добро пожаловать в SO !! –

+0

Спасибо! Я получаю много пользы от этого места на некоторое время; Я подумал, что пришло время начать возвращаться туда, где я могу^_ ^ – Plynx

0

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

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); 
}); 
Смежные вопросы