2010-07-01 72 views
2

与JQuery和JS变量有点误解。简单的例子: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

6分钟后的8个答案...哇, – jantimon 2010-07-01 14:42:05

回答

7

我不认为你的问题在这里是一个范围,实际上;我认为你的问题是post函数是异步的。也就是说,数据返回到服务器以获取数据,并在数据返回时(可能需要一段时间)运行回调函数(更新您的标志)。但与此同时,周围的功能还在继续;它不会等待post返回。所以标志更新发生在外部函数返回之后。

+0

+1你击败了@Darin Dimitrov 1秒;) – gnarf 2010-07-01 14:42:01

+1

如何解决它:使用jQuery的ajax选项'async:false' http://api.jquery.com/jQuery .ajax /等待AJAX​​请求。同时摆脱'$(function(){})'文档就绪绑定。 – 2010-07-01 14:49:14

+2

@Marcel - 我不会推荐'async:false',但不会注意它会锁定浏览器直到收到响应,这可能是一个问题。还有其他的补救措施可能不具有破坏性。如果浏览器被锁定是可以接受的,那么'async:false'是一个很好的解决方案。 :o) – user113716 2010-07-01 15:22:34

0

乍一看,通过设置flag = 'false'('false'是一个字符串)而不是flag = false作为bool,flag == false的测试永远不会成立。

UPDATE

此外,jQuery代码做一个帖子,这将晚得多返回比支票flag == false。看起来你认为代码完全是以线性方式操作,但是你设置flag == false的回调方法将在很晚的时候被调用。

+0

是的,这是我的小写作错误。我修好了它。但整个事情仍然是一样的... – Bounce 2010-07-01 14:40:35

0

问题在于回调函数稍后会被调用,因为AJAX是异步的。 $.post立即返回,并且当标志仍然为假时执行下一行。

4

你正在做两个异步操作:

  • $(function(){}) - 火灾功能时文件是 “准备”
  • $.post - 火灾XHR请求

它们都将立即返回, - 例如一个XHR请求需要时间才能完成 - 这就是为什么你要传递一个回调函数(所以你可以在完成后做的东西)。

虽然这些操作都出现在您的JS将继续执行,这意味着此:

if(flag == false){ 
    return false; 
} 

...要么操作之前执行(充其量只是$.post操作)完成。

+0

这些都不会立即执行 - 除非文档已经准备好,否则会立即调用$(function(){...})。 – gnarf 2010-07-01 14:44:26

1

AJAX回调仅在您返回后执行。

因此,当您编写if(flag == false)时,post回调尚未执行,因此flag仍然是true

0

$(function(){ ... }) and $.post("address", function() { ... }) not block。所以你的回调代码...将不会在js-interpreter打到if(flag == false)之前执行。这相当于:

var flag = true; 
doSomethingLater(); 
if(flag == false) 
    ... 

flag永远是true

删除$(function(){ ... })并使用async: falseoption为ajax请求。