2015-06-10 67 views
0

在發出警報時,它會始終發出警報jojotest2.php有文字Locojavascript全局變量不會在ajax回調中更新

div得到更新爲Loco但全局變量沒有變化。我試過window.temp = data,但它沒有奏效。

如何獲取變量中的返回值?請指導...

<div> 
yolo 
</div> 

<script type="text/javascript"> 
    var temp = 'jojo'; 

     $.ajax({ 
      url: 'test2.php', //Loco 
      success: function(data) 
      { 
        temp = data; 
        $('div').html(data); 
      }, 
      error: function (err) 
      { 
       alert('error'); 
      } 
     }); 

     alert(temp); 
     var toBeUsedLater = temp; //updated temp value from ajax call 
     refreshTab(); 
</script> 
+1

Bsien。我建議你閱讀關於ajax的異步行爲。 –

+0

好吧,我從中得到了很多有用的信息。我是JavaScript的初學者,所以幫助了很多。我想我必須用'async:false'選項來解決我目前的情況。 – Bsienn

+1

'async:false'使ajax同步,但在大多數情況下不會使用,因爲它會暫停執行,直到ajax返回並且頁面可能會凍結。所以放置'var toBeUsedLater = temp;'的更好的地方是在'success'回調(你在設置innerhtml的地方)或者在一些promise鉤子中。 你可以閱讀關於jQuery的承諾。 –

回答

4

這是一個異步功能。 (這就是AJAX中的A)。您正在立即提醒temp的值,因此它在異步調用完成之前發生。如果添加

alert(temp); 

要將success處理程序結束後,你會看到值已經更新。

1

1)變化 var temp = 'jojo' 到 「臨時= '喬喬'

由於這是不束縛於執行上下文和不限於文件(具有優缺點 - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/var

2)問題是該警報在回調之前被調用。 將警報移到功能中。由於ajax是異步調用的,意味着只有當ajax從服務器獲得響應時,纔會調用成功和錯誤函數,而現在的警報將立即被調用。

http://javascript.about.com/od/ajax/a/ajaxasyn.htm

$.ajax({ 
      url: 'test2.php', //Loco 
      success: function(data) 
      { 
        temp = data; 
        $('div').html(data); 
        alert(temp). 
      }, 
      error: function (err) 
      { 
       alert('error'); 

      } 
     }); 

3)另外,您可以設置AJAX的假異步: What does "async: false" do in jQuery.ajax()? 這將導致Ajax調用的下一行代碼前將完成,但強烈建議不要要做到這一點。

+0

刪除'var'並不是真正必要的,因爲它不直接在任何函數中作用域,所以它自動成爲全局變量,但其餘答案爲真。 – vinayakj

+0

@vinayakj只要你不分裂成多個文件,那麼它就是真的,然後它就成爲問題,這就是爲什麼不使用var更安全。 –

1

AJAX - asynchronous意味着您不會等待迴應來,Javascript是解釋語言一行接一行地執行。所以這裏alert(temp)會先執行,然後執行成功回調,因爲它需要一些時間來獲得響應。