【问题标题】:simulating a synchronous XmlHttpRequest模拟同步 XmlHttpRequest
【发布时间】:2009-11-27 17:42:22
【问题描述】:

我已经阅读了一些其他相关问题(Pattern for wrapping an Asynchronous JavaScript function to make it synchronous & Make async event synchronous in JavaScript & 可能还有更多),但我只是想确保用尽所有可能性。

是否可以使用 setInterval 或 setTimeout 将异步 XmlHttpRequest“转换”为准同步?

这个想法是,在 Ajax 请求成功后,将设置一个变量,这将是一个 while 循环(已调用 setInterval 或 setTimeout,以及适当的回调函数)退出的信号。还是我从根本上误解了 setInterval 和/或 setTimeout 的能力(或限制?)?

【问题讨论】:

  • 这没有意义。 setInterval 和 setTimeout 本身就引入了异步性,这将如何使您的 XHR 调用同步?
  • 当然有道理,当您考虑到最后我问“我是否从根本上误解了 setInterval 和/或 setTimeout 的能力(或限制?)?”,因为您的评论有助于回答那,我建议你留下答案而不是评论。

标签: javascript ajax settimeout synchronous setinterval


【解决方案1】:

确实,您不想按照您描述的方式使用 setInterval 和 setTimeout。您真正想要做的只是熟悉嵌套函数,您可以在其中以或多或少同步的方式编写代码。

例如:

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

虽然您可以使用 setInterval 和/或 setTimeout(在函数体中再次调用 setTimeout)来“轮询”成功代码,但这种方法明显不如一开始就处理回调而不是轮询它。它引入了延迟,与 CPU 一起运行,并且不能跨多个 XHR 请求进行扩展,仅举几个缺点。

XHR 将在完成时调用您的函数,运行一个询问“我们完成了吗?我们完成了吗?”的函数几乎没有意义。同时。另一方面,如果您希望在响应返回之前阻止某些周期性行为(例如,需要该数据运行的一段动画),则在 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; });

【讨论】:

  • 谢谢!一段时间以来,我从这个网站得到了很多使用;我想是时候开始回馈了^_^
【解决方案2】:

如果我的问题没问题,您可以使用以下代码实现类似的效果:

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);
});

【讨论】:

    猜你喜欢
    • 2021-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-28
    • 2017-06-01
    相关资源
    最近更新 更多