Firefox 3.5 中的同步 XHR 请求

这篇文章来自 Doug Turner,他之前写过关于 地理位置 的文章。Doug 参与 Mozilla 的 移动 项目。

XMLHttpRequests (XHR) 可以是同步的或异步的。虽然大多数人使用异步请求,但在某些情况下您可能希望使用同步请求。也就是说,等待 XMLHttpRequest 调用完成才能继续执行 JavaScript。在 Firefox 3 及更早版本中,浏览器在同步 XHR 请求期间仍会触发计时器事件并响应输入事件。在 Firefox 3.5 及更高版本中,鼠标移动和超时等输入事件将暂停,直到同步请求完成。这允许同步请求阻塞。

例如

function hello() {
     alert(“hello”);
}

setTimeout(hello, 20);

var req = new XMLHttpRequest();
req.open('GET', 'http://www.mozilla.org/', false);
req.send(null);

在 Firefox 3.5 之前,无法确定“hello”函数是在 XHR 请求期间还是之后被调用。这导致在使用同步 XHR 请求的 Web 应用程序中出现各种计时问题。

此问题的解决方案是将输入事件和超时延迟到“req.send”返回之后。

有关更多信息,请参阅关于此问题的 两个 错误


10 条评论

  1. Todd A. Fisher

    这意味着在 Worker 中使用同步 XHR 请求只会阻塞 Worker 线程吗?

    2009 年 7 月 1 日 11:47

  2. Ben Turner

    是的,Worker 中的同步 XHR 只会阻塞该 Worker 的脚本。

    2009 年 7 月 1 日 14:35

  3. 匿名

    这是否也能解释为什么使用大量同步 XHR 的网站的鼠标滚轮滚动速度如此缓慢?我在更新到 FF 3.5 后注意到了这一点。

    2009 年 7 月 1 日 16:35

  4. Jeff Walden

    Todd:没错。

    在 Worker 线程之外,同步 XHR 是撒旦的产物。如果用户的网络特别慢会发生什么?您可能会挂起应用程序 20 或 30 秒,如果运气不好,甚至更长时间。使用异步方式,不要依赖网络速度;无论您认为假设快速连接多么合理,最终都会出错,而且会非常糟糕。

    2009 年 7 月 1 日 19:59

  5. Martin

    我仍然遇到这个问题,

    在同步 XHR 请求期间,鼠标事件似乎仍在发送到 Flash 插件。
    我正在使用 ExternalInterface 启动 js 同步 XHR 请求。在请求运行期间,Flash UI 仍然接收和处理鼠标事件,即使在 FF 3.5 中也是如此,这导致了奇怪的情况,即我的 Flash 内容在此期间以某种方式多线程化,并且多个 ActionScript 块同时执行。

    相反,IE 和 Safari 会正确“冻结”Flash 内容。

    2009 年 7 月 8 日 04:42

  6. Martin

    在同步 XHR 请求期间,鼠标事件似乎仍在发送到 Flash 插件。
    我正在使用 ExternalInterface 启动 js 同步 XHR 请求。在请求运行期间,Flash UI 仍然接收和处理鼠标事件,即使在 FF 3.5 中也是如此。这导致了奇怪的情况,即我的 Flash 内容在同步请求期间以某种方式多线程化,并且多个 ActionScript 块同时执行。

    相反,IE 和 Safari 会正确“冻结”插件。

    2009 年 7 月 8 日 11:22

  7. 为什么您的 Firefox 3.5 变慢了?…

    tweetmeme_url = ”;tweetmeme_source = ‘tim_un’;
    我们都知道 Firefox 3.5 是一款快速的 Web 浏览器。一些用户在升级后遇到 Firefox 3.5 启动速度变慢的问题。您是否也遇到同样的问题?
    让我告诉你为什么我的更快,而你…

    2009 年 7 月 12 日 19:11

  8. 为什么您的 Firefox 3.5 变慢了?…

    tweetmeme_url = ”;tweetmeme_source = ‘tim_un’;
    我们都知道 Firefox 3.5 是一款快速的 Web 浏览器。一些用户在升级后遇到 Firefox 3.5 启动速度变慢的问题。您是否也遇到同样的问题?
    让我告诉你为什么我的更快,而你…

    2009 年 7 月 12 日 19:11

  9. [...] 在一系列从 Mozilla Hacks 博客翻译文章中,今天我带来了 Doug Turner 撰写的文章“Firefox 3.5 中的同步 XHR 请求”的翻译。Doug 在 Mozilla 参与 [...] 项目。

    2009 年 7 月 28 日 05:00

  10. skill-guru

    我认为这不是最佳方法。我之前也遇到过同样的问题,这是我为支持同步调用所做的事情。
    http://www.skill-guru.com/blog/2011/01/26/synchronous-calls-with-rest-service/

    2011 年 1 月 26 日 12:05

本文评论已关闭。