【问题标题】:jQuery: Performing synchronous AJAX requestsjQuery:执行同步 AJAX 请求
【发布时间】:2011-10-04 20:12:58
【问题描述】:

我过去做过一些 jQuery,但我完全坚持这一点。我知道使用同步 ajax 调用的优缺点,但在这里它是必需的。

远程页面已加载(由 firebug 控制),但没有显示返回。

我应该做些什么来让我的函数正确返回?

function getRemote() {

    var remote;

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

    return remote;

}

【问题讨论】:

  • 你的代码看起来不错。它在返回什么?有没有js错误?
  • 我觉得这很讽刺——你问的是如何同步执行“异步 JavaScript 和 XML”操作。您真正需要执行的是“SJAX”。
  • 注意:spec 已开始弃用同步 AJAX 请求。
  • 似乎声明“需要[同步]”表示对 JavaScript 引擎缺乏了解,因此是一个架构不佳的应用程序。我想了解是否存在确实需要同步的情况。
  • @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 调用的利弊’......也许只是相信他?

标签: ajax jquery synchronous


【解决方案1】:

当您发出同步请求时,应该是

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

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

请注意:将 async 属性设置为 false 已弃用,并且正在被删除 (link)。如果您使用此功能,包括 Firefox 和 Chrome 在内的许多浏览器已经开始在控制台中打印警告:

铬:

主线程上的同步 XMLHttpRequest 已被弃用,因为它会对最终用户的体验产生不利影响。如需更多帮助,请查看https://xhr.spec.whatwg.org/

火狐:

主线程上的同步 XMLHttpRequest 已被弃用,因为它会对最终用户的体验产生不利影响。如需更多帮助http://xhr.spec.whatwg.org/

【讨论】:

  • 请注意,responseText 总是返回一个字符串。如果您期待 JSON,请将 $.ajax 包装为 JSON.parse
  • 注意:xhr.spec.whatwg.org/#the-open()-method 不推荐使用同步请求...
  • @Tom <i><b> 标签也是如此。我的建议:继续使用这些功能,以免它们消失。
  • 因为这会锁定浏览器,所以在选项中添加一个 timeout : 5000 左右是有意义的。
  • @usandfriends 将字符串解析为对象更安全地使用 jQuery.parseJSON 而不是 JSON.parse stackoverflow.com/questions/10362277/…
【解决方案2】:

您错误地使用了 ajax 函数。由于它是同步的,它会像这样返回内联数据:

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

【讨论】:

    【解决方案3】:

    那个网址有多远?它来自同一个域吗?代码看起来不错

    试试这个

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

    【讨论】:

    • 是的!相同的域和一切。 remote_url 定义正确,AJAX 调用如前所述正确执行(由萤火虫控制)。就是不归路!
    【解决方案4】:
    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;
            }
        });
    }
    

    【讨论】:

    • 请解释一下为什么这会对 OP 有所帮助。
    • 最好从服务器端返回一个 json 对象。它为您提供更多控制权。但是,您需要在上面的 $.ajax 参数中添加 dataType: "json"。
    • 这是什么意思:“它给了你更多的控制权”?
    • 不相关但你可以:return result.valid; // 这已经是一个布尔值了
    猜你喜欢
    • 1970-01-01
    • 2015-02-10
    • 2016-02-13
    • 2011-08-11
    • 2011-10-09
    • 2012-12-07
    • 1970-01-01
    相关资源
    最近更新 更多