【问题标题】:undefined variable after ajax request [duplicate]ajax请求后未定义的变量[重复]
【发布时间】:2013-02-08 08:24:07
【问题描述】:

我正在使用 jQuery。我有一个从名为“get_cats”的远程服务器获取数据的函数。我调用它来用返回的值填充一个数组。 AJAX 完成后,我想返回这些值。 但它不起作用,返回的值是未定义的。这是非常基本的,但我看不出它失败的地方。有人知道吗?

$(function () {
        var url = "http://someurl.com/service/";
        var cats = [];
        cats = get_cats(url);

        function get_cats(url) {
            var categories = [];
            $.getJSON(url + "cats", function (data) {
                $.each(data, function (i) {
                    categories.push(data[i].name);
                });
                return categories;
            });
        }

        $(document).ajaxStop(function () {
            console.log(cats); // fails and returns undefined :'(
        });

    });

【问题讨论】:

  • 这样的问题很多,stackoverflow.com/questions/9041321/return-ajax-callback-return 是第一个看起来足够基本的问题。一个简单的搜索就能解决你的问题
  • 我对这篇文章投了第二票。你应该花时间了解更多关于 javascript 的知识,因为你需要在这里使用回调,因为 JS 是异步的 :) stackoverflow.com/questions/4506240/…
  • 只是一个普通的新手缺乏了解,他为什么会在这里!
  • 感谢您帮助我并分享这些链接。我会检查他们。信誉系统有点残忍,虽然我理解这是为了维护论坛的质量^^

标签: javascript jquery ajax json


【解决方案1】:

哦,没有 AJAX 是异步的,你不能从中返回任何东西。您应该只在成功回调中使用 AJAX 请求的结果:

$(function () {
    var url = "http://someurl.com/service/";
    get_cats(url);

    function get_cats(url) {
        var categories = [];
        $.getJSON(url + "cats", function (data) {
            $.each(data, function (i) {
                categories.push(data[i].name);
            });
            // Only here you can consume the results of the AJAX request
            // Do not attempt to return them, it doesn't make any sense
            console.log(categories);
        });
    }
});

【讨论】:

  • 您将cats = get_cats(url); 留在了更正的样本中
  • 感谢您的帮助,顺便说一句,很抱歉提出这个初学者问题。但这对我来说并不清楚。因此,如果我了解在全局范围内获取结果的唯一方法是声明一个全局变量,因为我无法从 ajax 返回任何 res ?
  • @just.another.programmer,说得好。我已经更新了我的答案。
  • @gallab,不,您不需要任何全局变量。在成功回调中,AJAX 调用的结果作为您可以使用的参数传递。如果需要,您可以将其传递给其他函数,依此类推。
【解决方案2】:

你可以试试:

$.ajaxSetup({async:false});

在 AJAX 调用之前。

但它会在返回响应时停止浏览器。

【讨论】:

  • 你想禁用javascript的优势吗?
  • 每个人都可以决定自己的网页设计。我认为这是优势,你可以做到这一点。如果它不能满足您的需求,您可以寻找其他解决方案!
  • 即使忽略同步 Ajax 的(主要)缺点,您的建议本身也不足以解决问题,因为 OP 的 get_cats() 函数将始终返回 undefined,因为它没有实际上没有return 声明。 (显示的 return 语句位于 Ajax 完成处理程序中,因此将忽略返回值。)
  • 它不是 Ajax!它的 Sjax(同步):)
  • @TomTom 不是根据您的评分来判断您,而是根据您回答的质量来判断您。您建议的解决方案虽然可能有效,但却是一种非常糟糕的做法。对于实际了解 AJAX 回调的工作原理来说,这是一个糟糕的替代品。
猜你喜欢
  • 2017-06-26
  • 2019-08-10
  • 1970-01-01
  • 1970-01-01
  • 2019-02-18
  • 2016-05-18
  • 2021-12-17
  • 2011-10-12
  • 1970-01-01
相关资源
最近更新 更多