但出于某种原因,当我将变量数据置于顽皮时,它没有数据的内容。
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中删除!只有特殊的用例才会......
答案 0 :(得分:10)
这是竞争条件。由于.post()是一个异步函数,因此在淘气重置为数据之前执行警报。
如果您希望在继续之前返回响应,可以使用.ajax并将async设置为false。
答案 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
会在响应到达后更新。
async: false
答案 2 :(得分:1)
这是因为$ .post是异步的。在请求页面时执行会立即离开该行,并且尚未调用函数(数据),因此数据为空。空数据是警报提取的内容。这只能在请求完成后才能工作,例如以同步方式,警报语句必须等待
答案 3 :(得分:0)
由于$.post
是ajax
请求,因此它本质上是异步的,所以您要做的就是确保在ajax
请求完成之后再做无论你想要什么:
function cookie() {
var naughty ;
$.post('/cookie', function(data) {
naughty = data;
}).done(function(){
alert(naughty);
});
}
答案 4 :(得分:0)
我的猜测是$ .post异步工作。因此,在执行回调回调之前,将调用您的警报。如果您将警报放在帖子回调中,您应该得到正确的结果。