模拟一个同步的XmlHttpRequest
我已经阅读了其他一些相关的问题(包装一个异步JavaScript函数以使其同步并使JavaScript中的异步事件同步,并且可能还有更多),但我只是想确保耗尽所有可能性。
可能使用setInterval或setTimeout将异步XmlHttpRequest“转换”为准同步的XmlHttpRequest?
这个想法是,一旦Ajax请求成功,将设置一个变量,该变量将作为while循环的信号(它已经调用了setInterval或setTimeout,以及适当的回调函数)来退出。 或者我从根本上误解了setInterval和/或setTimeout的功能(或限制?)?
确实如此,您不希望按照您所描述的方式使用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; });
如果我正确地得到您的问题,您可以使用以下代码获得类似的效果:
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);
});
链接地址: http://www.djcxy.com/p/55331.html