6

我对在 $.ajax() 中使用 async: false 选项感到困惑。根据 $.ajax() 文档:

从 jQuery 1.8 开始,不推荐在 jqXHR ($.Deferred) 中使用 async: false ;您必须使用成功/错误/完成回调选项而不是 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))

我的控制台输出是:

tock
{}
滴答声

我做错了什么,还是我做错了什么

4

3 回答 3

11

它的意思是,如果您的请求是,async: false那么您不应该使用ajax.done(),ajax.fail()等方法来注册回调方法,而是需要使用success/error/complete选项将回调方法传递给 ajax 调用

正确的

$.ajax({
    async: false,
    success: function(){
    },
    error: function(){
    },
    complete: function(){
    }
})

错误的

$.ajax({
    async: false
}).done(function(){
}).fail(function(){
}).always(function(){
})

if async: true //未指定

正确的

$.ajax({
}).done(function(){
}).fail(function(){
}).always(function(){
})

或者

$.ajax({
    async: false,
    success: function(){
    },
    error: function(){
    },
    complete: function(){
    }
})
于 2013-08-16T07:36:24.013 回答
3

DeferredjQuery中的对象promises在 AJAX 中处理。事实上,这async: false将完全打破您需要处理承诺的异步调用的概念。

jQuery 文档片段告诉您的是,这样的事情将被禁止。

$.ajax({
    async: false,
    /*rest of the options*/
}).done(function(){
    //do something after the response comes back successfully
});

但是,附加回调选项是完全有效的,并且是将 AJAX 与async: false.

$.ajax({
    async: false,
    /*Rest of the options*/
    success: function(){
                console.log("foo");
             }
});
于 2013-08-16T07:38:31.697 回答
3

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

dataType:       'json',

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

于 2013-08-16T07:40:47.203 回答