【问题标题】:Getting vars from $.get ajax call in jquery从 jquery 中的 $.get ajax 调用获取 vars
【发布时间】:2011-05-20 08:39:17
【问题描述】:

我知道这方面有很多线程..但我在 ajax 方面很糟糕,并且无法终生解释答案。

var loadUrl = "lib/php/ajax.php";

$.ajaxSetup ({ cache: false });

$.get(loadUrl +  href, function(data)
{
    var obj = $.parseJSON(data);
    console.log(obj.commentCount, obj.fileName);            
});  console.log(obj.commentCount, obj.fileName); // this one doesn't work.

如何在函数之外获取这些变量 =/ 我知道我需要使用某种回调函数 .. 或其他东西

【问题讨论】:

    标签: jquery ajax function callback get


    【解决方案1】:

    你不能有两个原因:

    1. $.get 之后的代码会立即运行。函数内部的代码只在ajax响应返回后运行
    2. var obj 是在内部函数的范围内创建的,因此外部无法访问。

    你可以让它工作的唯一方法是在 ajax 请求之外声明 obj,在函数内部分配值并将 ajax 请求设置为不异步(参见jquery Ajax)虽然这有点失败使用 ajax 并将阻止该站点,直到结果返回。

    【讨论】:

    • 我已经将异步转换为错误的作品就好了,但我猜我不应该养成这样做的习惯?不是 100% 该值是真还是假之间的区别是什么..
    • 如果为 false,则在返回 ajax 响应之前,页面上不会发生任何其他事情。如果这需要很长时间,浏览器可能会出现冻结。最好是利用好回调函数来运行依赖ajax结果的代码。
    【解决方案2】:

    回调在 ajax 调用完成后执行。您的最后一个 console.log() 语句将首先被调用,因为 ajax 请求是异步发生的。另一个问题是obj属于回调的范围,这使得它在外部不可用。如果您在回调之外声明它,它将可用但由于第一个问题仍然不可用。它将为空,直到 ajax 调用完成。在回调中做工作有什么问题?

    【讨论】:

    • 这是有道理的。这就是我最终做的。我在回调中完成了工作
    【解决方案3】:

    先声明var objvar obj在函数外,然后你可以将它设置为=内部的数据,然后在外部引用它。

    var loadUrl = "lib/php/ajax.php";
    var obj = "";
    
    $.ajaxSetup ({ cache: false });
    
    $.get(loadUrl +  href, function(data)
    {
        obj = $.parseJSON(data);
        console.log(obj.commentCount, obj.fileName);            
    });
    console.log(obj.commentCount, obj.fileName);
    

    【讨论】:

    • 这仍然会在调用 $.get 函数之前执行第二个 console.log =/
    • 这不能作为第二个 'console.log(obj.commentCount, obj.fileName);'将在返回 ajax 响应之前运行,因此不会设置 obj。
    • 为什么在相同的数据上内外调用console.log?目的是什么?也许我可以通过更多解释两次调用相同数据的预期目的来提供更多帮助。
    【解决方案4】:
    var loadUrl = "lib/php/ajax.php";
    
    function processAjaxResponse(obj)
    {
      console.log(obj.commentCount, obj.fileName);
    };
    
    $.ajaxSetup ({ cache: false });
    
    $.ajax({
        type: 'GET',
        dataType: 'JSON',
        url: loadUrl +  href,
        success: function(data) {
           processAjaxResponse(data);
       }
    });
    

    【讨论】:

    • 这不能作为第二个 'console.log(obj.commentCount, obj.fileName);'将在返回 ajax 响应之前运行,因此不会设置 obj。
    • 这个例子仍然在第一个=(之前调用第二个console.log
    • 我看到你在那里做了什么......这很有趣。你把它推到不同的功能。很时髦。
    • 这仍然与以前几乎完全相同,只是它调用的是命名函数而不是匿名函数。外部 obj 变量仍然没有值。
    • @Richard,是的,obj 现在没用了(我会编辑它)。就实践而言,这是最好的方法;在可以避免的情况下最好不要污染全局变量空间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多