如何使用jQuery进行同步的JSON AJAX调用

3

我有以下的json ajax调用:

$.getJSON(server_data.secure_api+'/e/account/check/?callback=?', queryData,
    function(data) {
        has_error = (data.status == 'failure');
});

这段代码本来运作良好,但它是异步的。现在我需要将其变成同步的,因为我需要暂停调用函数直到 has_error 被设置。我该怎么做?

我已经尝试使用 .ajax 调用,像这样:

jQuery.ajax({
    url:        server_data.secure_api+'/e/account/check/?callback=?',
    data:       queryData,
    DataType:   'jsonp',
    success:    function(result) {
                has_error = (data.status == 'failure');
            },
    async:      false
});

但是它不起作用!我已经尝试将DataType设置为json、jsonp或未设置;我已经尝试包含?callback=?,也尝试过不包含;但这些都没有起作用。我做错了什么?


@SLaks 我有什么不能做的? - Benubird
你正在使用哪个版本的jQuery?“在1.8之后,false已被弃用;您必须使用成功/错误/完成回调选项来代替相应的方法。” - bluszcz
@bluszcz jquery-2.1.0 - Benubird
2个回答

8
默认情况下,所有请求都是异步发送的(即默认设置为true)。如果您需要同步请求,请将此选项设置为false。跨域请求和dataType:“jsonp”请求不支持同步操作。请注意,同步请求可能会暂时锁定浏览器,在请求处于活动状态时禁用任何操作。
自jQuery 1.8起,使用async:false与jqXHR($.Deferred)已被弃用;您必须使用success / error / complete回调选项来代替相应的方法。

http://api.jquery.com/jQuery.ajax/


1
所以,你是在说同步调用不再可能了吗? - Benubird
这基本上就是他所说的。 - Jay Blanchard

0

没有理由需要同步代码来满足您的使用情况。如果您需要一些代码在异步调用完成之前延迟执行,则将该代码放置在回调函数中。


这是作为表单提交的一部分发生的,如果有错误则会中止。我可以那样做,但这样会更整洁。 - Benubird
如果你正在使用AJAX,为什么还要尝试进行标准表单提交呢?为什么不把所有东西都用AJAX处理呢? - Spencer Ruport
因为我需要将数据提交到另一个页面,使用ajax请求保存数据后再进行重定向似乎有些浪费。 - Benubird
@Benubird - 以后请注意,即使有人告诉你一些你不想听的事情,也没有理由不给他们点赞。 - Spencer Ruport
你并没有告诉我任何有用的信息 - 什么回调函数?在哪里?我该如何在其中放置代码?我猜你可能在谈论jquery.deferred,但你在这里没有命名它。当别人甚至没有将相关手册链接给我时,我不能因为他们说RTFM就给他们点赞。点赞是为了有用的答案;这个答案对我来说没有用。 - Benubird
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接