2009-11-27 45 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)到“人头”的成功代码,这种做法是大大逊色于刚首先处理回调,而不是轮询它。它引入了延迟,与CPU一起运行,并且不会跨多个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); 
});