请看下面的代码,您认为首先要打印哪个日志吗?
在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) {
}
})
答案 0 :(得分:5)
要“正确”实现某些东西,必须有一些规范。
在规范中,我没有发现任何引用,只要同步请求没有完成,所有脚本都应该停止执行(请注意,当sync-XHR启动时,async-XHR已经在运行)。
但我发现了这个:
Each XMLHttpRequest object has its own task source. Namely, the XMLHttpRequest task source.
- 这两个请求代表一个任务来源 -
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.
- 这两项任务可能会添加到同一任务队列中,但不得 -
当我没有误解这一点时,我的逻辑没有错,这可能会继续:
Firefox将两个XHR放在同一个队列中,IE和chrome将它们放在不同的任务队列中。
所有浏览器现在都运行任务队列,放置同步XHR。
这两种实现似乎都是正确的。