如何从jQuery变量到函数?

时间:2012-08-07 17:09:20

标签: javascript jquery variables scope

但出于某种原因,当我将变量数据置于顽皮时,它没有数据的内容。

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

为什么?

更新:谢谢!现在我得到了它,因为$ .post()是异步的,所以警告(顽皮)将在之前执行它将被数据填充。

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

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

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

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

最后编辑: 我意识到我想要的是ASYNC:FALSE ......所以我只是用它。 BTW。 ASYNC:FALSE不会从jQuery中删除!只有特殊的用例才会......

5 个答案:

答案 0 :(得分:10)

这是竞争条件。由于.post()是一个异步函数,因此在淘气重置为数据之前执行警报。

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

How can I stop $.post in jQuery working asynchronously?

答案 1 :(得分: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会在响应到达后更新。

注意

jQuery 1.8中不推荐使用

async: false

答案 2 :(得分:1)

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

答案 3 :(得分:0)

由于$.postajax请求,因此它本质上是异步的,所以您要做的就是确保在ajax请求完成之后再做无论你想要什么:

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

答案 4 :(得分:0)

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