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

Leo*_*袁力皓 5 ajax firefox jquery

请看下面的代码,您认为首先打印哪个日志?
在Chrome和IE中,"同步ajax调用:成功"首先显示,
但是在FF(在FF 3.6和FF 17.0中测试),"异步ajax调用:成功"首先显示,
这意味着虽然我们制作了第二个作为同步调用,但是当它的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) {
    }
})
Run Code Online (Sandbox Code Playgroud)

Dr.*_*lle 5

要实现"正确"的东西,必须有一些规范.

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

但我发现了这个:

  1. 每个XMLHttpRequest对象都有自己的任务源.即,XMLHttpRequest任务源.
    - 两个请求都代表一个任务来源 -

  2. 当用户代理要对任务进行排队时,它必须将给定任务添加到相关事件循环的任务队列之一.[...]来自不同任务源的任务可以放在不同的任务队列中.
    - 两个任务可以添加到同一个任务队列中,但不能 -

  3. 只要存在,事件循环必须连续执行以下步骤:
    1.在事件循环的任务队列之一上运行最旧的任务,如果有的话,[...].用户代理可以选择任何任务队列.

    - 他现在选择了他在同步请求中放置的任务队列

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

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

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

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

两种实现似乎都是正确的.