1

但是由于某种原因,当我将变量data放入naughty时,它没有data的内容。

function cookie() {
    var naughty = 'aaa';
    $.post('/cookie', function(data) {
        naughty = data;
    });
    alert(naughty); // sends "aaa"
}

为什么?

更新:谢谢!现在我明白了,因为 $.post() 是异步的,所以 alert(naughty) 将在它被填充数据之前执行。

现在我有一个子问题:当我关闭异步时,只有函数 cookie() 会推迟执行还是整个浏览器引擎会冻结,直到 AJAX 完成?

更新2:是的,@Kevin B,你是对的,顽皮永远不会被填满......我在第一个代码示例中犯了错误。我很幸运,所有答案都是有效的,只有第二个代码示例:-)

正如@Kevin B 所指出的, async=false 将在 jQuery 1.8 中贬值。它会冻结浏览器,直到请求完成......

子问题 #2:在这个 AJAX 请求之后,我在 cookie() 中有更多代码。那么,我可以以某种方式暂停 cookie() 的执行直到 AJAX 完成,而不用 async=false 冻结整个浏览器?还是我必须找到编码这个想法的新方法(使用完整/成功回调)?

最后编辑:我意识到我想要的是 ASYNC:FALSE ......所以我只是使用它。顺便提一句。ASYNC:FALSE 不会从 jQuery 中删除!只有特殊类型的用例才会......

4

5 回答 5

10

这是一个竞赛条件。由于 .post() 是一个异步函数,警报会在 naughty 重置为数据之前执行。

如果您希望在继续之前返回响应,您可以使用 .ajax 并将 async 设置为 false。

如何在 jQuery 中停止 $.post 异步工作?

于 2012-08-07T17:11:44.063 回答
4

只需这样做:

function cookie() {
    var naughty = 'aaa';
    $.post('/cookie', function(data) {
        naughty = data;
        callNaughty(naughty);
    });
    
}

function callNaughty(naughty) {
  alert(naughty); 
}

或者

function cookie() {
    var naughty = 'aaa';
    $.post('/cookie').done(function(data) {
        naughty = data;
        alert(naughty)
    });
}

由于$.post()是异步的,所以naughty会在响应到达后更新。

笔记

async: false在 jQuery 1.8 中已弃用

于 2012-08-07T17:12:40.770 回答
1

这是因为 $.post 是异步的。在请求页面并且尚未调用函数(数据)时,执行立即离开该行,因此数据为空。空数据是警报接收的内容。这只能在请求完成后才能工作,例如以警报语句必须等待的同步方式

于 2012-08-07T17:13:36.923 回答
0

我的猜测是 $.post 正在异步工作。因此,在执行后回调之前会调用您的警报。如果您将警报放在 post 回调中,您应该得到正确的结果。

于 2012-08-07T17:18:12.940 回答
0

由于$.post它是一个ajax请求,它本质上是异步的,所以你想要做的是确保在你的ajax请求完成后,然后做任何你想做的事情:

function cookie() {
    var naughty ;
    $.post('/cookie', function(data) {
        naughty = data;
    }).done(function(){
        alert(naughty);
    });
}
于 2012-08-07T17:14:13.167 回答