2010-07-01 59 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請求。