模拟一个同步的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

上一篇: simulating a synchronous XmlHttpRequest

下一篇: AJAX requests Synchronous Vs Asynchronous