Ajax是否已在Firefox中正确实现?同步问题

时间:2013-01-11 05:25:00

标签: jquery ajax firefox

请看下面的代码,您认为首先要打印哪个日志吗? 在Chrome& IE,“同步ajax调用:成功”首先显示,预期,
但是在FF(在FF 3.6和FF 17.0中测试)中,首先显示“async ajax call:success”, 这意味着虽然我们将第二个作为同步调用,但是当它的onreadystatechange被触发时,异步(第一个)ajax调用的处理程序比同步(第二个)ajax调用执行得更好,是否有意义?
这不是一个火狐虫吗?

// first ajax call, Note: this is asynchronous.
$.ajax({
    url: "/rest/someUrl",
    async : true,
    dataType : "json",
    contentType: "application/json",
    success : function(data) {
        console.log("async ajax call: success");
    },
    error : function(data) {
    }
})
// second ajax call, Note: this is synchronous.
$.ajax({
    url: "/rest/someUrl",
    async : false,
    dataType : "json",
    contentType: "application/json",
    success : function(data) {
        console.log("sync ajax call: success");
    },
    error : function(data) {
    }
})

1 个答案:

答案 0 :(得分:5)

要“正确”实现某些东西,必须有一些规范。

在规范中,我没有发现任何引用,只要同步请求没有完成,所有脚本都应该停止执行(请注意,当sync-XHR启动时,async-XHR已经在运行)。

但我发现了这个:

  1. Each XMLHttpRequest object has its own task source. Namely, the XMLHttpRequest task source.
       - 这两个请求代表一个任务来源 -

  2. When a user agent is to queue a task, it must add the given task to one of the task queues of the relevant event loop. [...] tasks from different task sources may be placed in different task queues.
      - 这两项任务可能会添加到同一任务队列中,但不得 -

  3. An event loop must continually run through the following steps for as long as it exists:
    1.Run the oldest task on one of the event loop's task queues, if any, [...]. The user agent may pick any task queue.

      - 他现在选择了他提出同步请求的任务队列

  4. 当我没有误解这一点时,我的逻辑没有错,这可能会继续:

    Firefox将两个XHR放在同一个队列中,IE和chrome将它们放在不同的任务队列中。

    所有浏览器现在都运行任务队列,放置同步XHR。

    • 在IE和Chrome中,同步XHR是队列中最早的任务并运行
    • 在FF中,异步XHR是队列中最早的并运行

    这两种实现似乎都是正确的。