如何在jQuery中从$ .post()返回变量?关闭变量?

时间:2010-05-19 20:26:35

标签: javascript jquery ajax closures

我无法将从$ .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

请帮忙!

4 个答案:

答案 0 :(得分:3)

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

  1. 调用last_update()
  2. 发出ajax请求,记得执行回调函数,但现在不执行
  3. 调用第二个警报(_j.text);
  4. 当ajax请求返回数据时,执行回调函数
  5. 将使用AJAX返回数据的代码移动到success()函数(这是你的返回函数function($j)) - 成功函数的用途。

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

答案 1 :(得分:1)

如果要访问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)
}

基本上与将代码放在回调中相同,但如果你有一些代码可以在其他地方重复使用,那么它会非常有用。

答案 2 :(得分:0)

您可以使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);
}

答案 3 :(得分:-1)

_j函数范围内创建last_update