对JQuery和JS变量有点误解。简单的例子:
function someFunc(){
var flag = true;
$(function(){
$.post("/some/address/", {} ,function(data){
if( data == false){
flag = false;
}
});
});
if(flag == false){
return false;
}
}
主要问题是Jquery函数中变量标志的可访问性。我总是得到相同的标志值等于true。如何做到这一点?如何使全局变量对JS和JQuery可见?
答案 0 :(得分:7)
我认为你的问题不是范围,实际上;我认为你的问题是post
函数是异步的。也就是说,它会在服务器上获取数据,并在数据返回时运行回调函数(更新标志)(这可能需要一段时间)。但同时,周围的功能还在继续;它不会等待post
返回。因此,在外部函数返回后发生标志更新。
答案 1 :(得分:4)
您正在进行两项异步操作:
$(function(){})
- 当文档“准备好”时触发功能$.post
- 触发XHR请求这些都不会立即返回,例如一个XHR请求需要时间才能完成 - 这就是你传递一个回调函数的原因(这样你就可以在完成时做东西)。
当这些操作正在发生时,你的JS将继续执行,这意味着:
if(flag == false){
return false;
}
...在任一操作(最好只是$.post
操作)完成之前执行。
答案 2 :(得分:1)
AJAX回调仅在您返回后执行。
因此,当您撰写if(flag == false)
时,post
回调尚未执行,因此flag
仍为true
。
答案 3 :(得分:0)
乍看之下,通过设置flag = 'false'
(将'false'设为字符串)而不是flag = false
设置为bool,对flag == false
的测试将永远不会成立。
<强>更新强>
此外,您的jQuery代码正在发布一个帖子,该帖子的返回时间远早于flag == false
的检查。似乎你认为代码完全以线性方式运行,但是你设置flag == false
的回调方法将在很晚的时候被调用。
答案 4 :(得分:0)
问题是稍后调用回调函数,因为AJAX是异步的。 $.post
立即返回,当flag仍为false时执行下一行。
答案 5 :(得分:0)
$(function(){ ... })
和$.post("address", function() { ... })
不会阻止。因此,在js-interpreter命中...
之前,不会执行if(flag == false)
处的回调代码。它相当于:
var flag = true;
doSomethingLater();
if(flag == false)
...
flag
始终为true
。
删除$(function(){ ... })
并使用async: false
option获取ajax请求。