【问题标题】:How do I return a variable from $.post() in jQuery? Closure variable?如何在 jQuery 中从 $.post() 返回一个变量?闭包变量?
【发布时间】:2010-05-19 20:26:34
【问题描述】:

我在传递从 $.post() 函数检索到的数据以在我的代码中的其他位置使用时遇到问题。我想将数据保存为变量并在 post() 函数之外使用它。这是我的代码:

var last_update = function() {
$.post('/--/feed',
{func:'latest', who:$.defaults.login},
function($j){
            _j = JSON.parse($j);    
            alert(_j.text); // This one works    
        });
}
alert(_j.text); // This one doesn't
};

last_update(); //run the function

请帮忙!

【问题讨论】:

  • 在您的第二个警报中,_jundefined,因此 _j.text 正在尝试访问 undefined 上的属性,但失败了。您是否特别需要在 AJAX 回调之外运行代码,而不是将其放在内部?

标签: javascript jquery ajax closures


【解决方案1】:

$.post() AJAX 调用是异步的 - 这意味着 AJAX 请求在通常的程序执行中是无序的,并且在您的程序中,这意味着在填充 _j 之前调用了第二个警报。执行顺序为:

  1. 调用 last_update()
  2. 发出ajax请求,记得执行回调函数但不是现在
  3. 调用第二个警报(_j.text);
  4. ajax请求返回数据时,执行回调函数

将利用 AJAX 返回数据的代码移动到 success() 函数(这里是您的返回函数 function($j))——成功函数的用途。

$.post() 是对 $.ajax() 的别名调用 - 完整文档 here

【讨论】:

  • 谢谢,我想知道的是如何在success函数之外使用返回的数据。有什么建议吗?
  • 您必须将利用 AJAX 返回数据的代码移动到 success() 函数 - 直到该阶段数据才会返回到脚本
【解决方案2】:

如果您想在 ajax 请求回调之外访问数据值,则需要将该代码放在一个函数中,并从成功回调中调用它。

var last_update = function() {
$.post('/--/feed',
{func:'latest', who:$.defaults.login},
function($j){
            _j = JSON.parse($j);    
            alert(_j.text); // This one works   
            someOtherFunc(_j.text); 
        });
}
};

last_update(); //run the function

function someOtherFunc(val) {
    alert(val)
}

基本上与将代码放在回调中相同,但如果您有一些在其他地方重用的代码,则可能会很有用。

【讨论】:

    【解决方案3】:

    你可以让你的 POST 请求同步并且有一个全局的 _j 变量:

    // global!!!
    var _j;
    
    $.ajax({
      async: false,
      url: '/--/feed',
      data: { func:'latest', who:$.defaults.login },
      success: function($j) {
        _j = JSON.parse($j);    
        alert(_j.text); // This one works
      }
    });
    
    function last_update() {
      if (typeof _j != 'undefined') {
        alert(_j);
      }
    }
    

    或者您可以简单地从您的成功回调中调用 last_update(),从而不再需要异步:

    $.ajax({
      url: '/--/feed',
      data: { func:'latest', who:$.defaults.login },
      success: function($j) {
        _j = JSON.parse($j);    
        alert(_j.text); // This one works
        last_update(_j);
      }
    });
    
    function last_update(_j) {
        alert(_j);
    }
    

    【讨论】:

      【解决方案4】:

      last_update函数范围内创建_j

      【讨论】:

      • 看起来 _j 是一个全局变量。但问题在于异步性质,而不是范围。
      • 我以为他的问题是如何将_j变成闭包变量。
      • @彼得。根据 OP 对 Andy 的回应,看起来我的解释是正确的,尽管我承认我没有解释为什么他的例子不起作用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-08
      • 1970-01-01
      • 2012-03-21
      • 1970-01-01
      相关资源
      最近更新 更多