jQuery:执行同步AJAX请求


187

我过去曾经做过一些jQuery,但是我完全坚持了这一点。我了解使用同步ajax调用的优缺点,但是在这里将是必需的。

远程页面已加载(由firebug控制),但未显示任何返回信息。

我应该采取什么措施才能使函数正确返回?

function getRemote() {

    var remote;

    $.ajax({
        type: "GET",
        url: remote_url,
        async: false,
        success : function(data) {
            remote = data;
        }
    });

    return remote;

}

您的代码看起来不错。返回的是什么?有没有js错误?
ShankarSangoli 2011年

11
我觉得这很讽刺-您正在询问如何同步执行“异步JavaScript和XML”操作。您真正需要执行的是“ SJAX”。
VitalyB 2014年

3
注意:规范已开始弃用同步AJAX请求。
Lao Lam

2
似乎“将需要[synchronous]”语句表明对JavaScript引擎缺乏了解,因此应用程序架构不佳。我想了解是否确实需要同步。
pmont

15
@pmont seems that the statement "[synchronous] will be required" indicates a lack of understanding of JavaScript engines, thus a poorly architected app.或一个很好的理解:如果要进行AJAX调用onbeforeunload,则实际上建议使用同步请求(因为浏览器窗口在请求返回之前会消失)。无论如何,他清楚地说:“我知道使用同步ajax调用的利弊”……也许只是相信他?
Stijn de Witt

Answers:


297

在发出同步请求时,应该

function getRemote() {
    return $.ajax({
        type: "GET",
        url: remote_url,
        async: false
    }).responseText;
}

范例-http://api.jquery.com/jQuery.ajax/#example-3

请注意:设置异步属性设置为false被弃用,并在过程中被移除(链接)。如果使用以下方法,包括Firefox和Chrome在内的许多浏览器已经开始在控制台中打印警告:

铬:

不赞成在主线程上使用同步XMLHttpRequest,因为它会对最终用户的体验产生不利影响。如需更多帮助,请访问https://xhr.spec.whatwg.org/

Firefox:

不赞成在主线程上使用同步XMLHttpRequest,因为它会对最终用户的体验产生不利影响。有关更多帮助,请访问http://xhr.spec.whatwg.org/


16
请注意,responseText始终返回一个字符串。如果你期待JSON,包装$.ajaxJSON.parse
usandfriends 2014年

6
注意:建议使用xhr.spec.whatwg.org/#the-open()-方法同步请求...
teynon 2015年

5
@Tom和<i>and <b>标记也是如此。我的建议:继续使用这些功能,以免它们消失。
Stijn de Witt

1
因为这会锁定浏览器,所以有必要在选项中添加超时:5000左右。
commonpike 2015年

1
@usandfriends对于解析字符串对象是更安全,而不是使用JSON.parse jQuery.parseJSON stackoverflow.com/questions/10362277/...
安东

33

您没有正确使用ajax函数。由于它是同步的,因此它将内联返回数据,如下所示:

var remote = $.ajax({
    type: "GET",
    url: remote_url,
    async: false
}).responseText;

17

该网址有多远?是来自同一个域?代码看起来还不错

试试这个

$.ajaxSetup({async:false});
$.get(remote_url, function(data) { remote = data; });
// or
remote = $.get(remote_url).responseText;

是的 相同的域和所有内容。remote_url正确定义,并且AJAX调用已如所述正确执行(由firebug控制)。只是没有回报!
工业

3
function getRemote() {
    return $.ajax({
        type: "GET",
        url: remote_url,
        async: false,
        success: function (result) {
            /* if result is a JSon object */
            if (result.valid)
                return true;
            else
                return false;
        }
    });
}

7
请提供一些解释,说明这对OP有何帮助。
krillgar 2014年

从服务器端返回json对象是一个好习惯。它给您更多的控制权。但是,您需要在上面的$ .ajax参数中添加dataType:“ json”。
jjwdesign

这是什么意思:“它给您更多控制权”?
Grantwparks'Mar

3
不相关,但是您可以:return result.valid; //这已经是一个布尔
dpineda
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.