我对使用带有$ .ajax()的async:false选项感到困惑.根据$ .ajax()文档:
从jQuery 1.8开始,不推荐使用async:false和jqXHR($ .Deferred); 您必须使用success/error/complete回调选项而不是jqXHR对象的相应方法,例如jqXHR.done()或不推荐使用的jqXHR.success().
我不知道jqXHR($ .Deferred)是什么意思.是因为任何原因使用async:false折旧,还是jqXHR($ .Deferred)某种特殊用例?
我问,因为我无法异步发生$ .ajax()调用.这是jQuery 1.8.2:
var ret = {};
$.ajax({
async: false,
method: 'GET',
contentType: 'application/json',
dataType: 'jsonp',
url: '/couchDBserver',
error: myerr,
success: function(data) {
var rows = data.rows;
//something that takes a long time
for(var row in rows) {
ret[rows[row].key] = rows[row].value;
}
console.log('tick');
}
});
console.log('tock');
console.log(JSON.stringify(ret))
Run Code Online (Sandbox Code Playgroud)
我的控制台输出是:
tock
{}
tick
我是不是做错了什么,还是我做的事情错了?
Aru*_*hny 10
它是什么意思是,如果你的要求async: false,那么你不应该使用ajax.done(),ajax.fail()等方法来注册回调方法,而不是你需要通过使用回调方法success/error/complete选项Ajax调用
正确
$.ajax({
async: false,
success: function(){
},
error: function(){
},
complete: function(){
}
})
Run Code Online (Sandbox Code Playgroud)
错误
$.ajax({
async: false
}).done(function(){
}).fail(function(){
}).always(function(){
})
Run Code Online (Sandbox Code Playgroud)
if async:true //未指定
正确
$.ajax({
}).done(function(){
}).fail(function(){
}).always(function(){
})
Run Code Online (Sandbox Code Playgroud)
要么
$.ajax({
async: false,
success: function(){
},
error: function(){
},
complete: function(){
}
})
Run Code Online (Sandbox Code Playgroud)
您尝试同时使用 JSONP 技术和 async:false 。这不可能。JSONP 实际上是创建一个script元素并将其附加到文档的某个位置,因此它不是 XHR,并且 jQuery 无法在任何地方传递同步标志。由于您从同一来源获取数据,只需将 dataType 更改为
dataType: 'json',
Run Code Online (Sandbox Code Playgroud)
然而,每个人都可以告诉你,同步请求不好,它们会挂起你的浏览器。您应该仅在少数情况下使用它们。