我已经阅读了其他一些相关问题(用于包装异步JavaScript函数以使其同步的模式& 在JavaScript中使异步事件同步并且可能有更多),但我只想确保耗尽所有可能性。

有可能“转换”使用setInterval或setTimeout将异步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);
});
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top