async:false选项在$ .ajax()中不起作用,是否在jQuery 1.8+中针对所有用例进行了折旧?

ddo*_*arr 6 jquery

我对使用带有$ .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)


Tom*_*mmi 4

您尝试同时使用 JSONP 技术和 async:false 。这不可能。JSONP 实际上是创建一个script元素并将其附加到文档的某个位置,因此它不是 XHR,并且 jQuery 无法在任何地方传递同步标志。由于您从同一来源获取数据,只需将 dataType 更改为

dataType:       'json',
Run Code Online (Sandbox Code Playgroud)

然而,每个人都可以告诉你,同步请求不好,它们会挂起你的浏览器。您应该仅在少数情况下使用它们。