2015-08-31 50 views
-1
var myXML; 
$.ajax({ 
    type:'GET', 
    url:'http://localhost:8080/someCGIhere/', 
    datatype:'xml', 
    success: function(xml){ 
    console.log('Success!'); 
    myXML = $(xml).find('SomeThing').text(); 
    //1) Prints out the myXML value   
    console.log("myXML = " +myXML); 
    } 
}); 

//2) Prints out undefined 
console.log('Result = '+myXML); 

爲什麼響應沒有存儲在成功範圍之外,考慮到它將值賦給一個在範圍外聲明的變量?

+6

'$ .ajax'生成一個異步請求,所以'// 2'在'// 1'之前執行。您應該能夠在控制檯中的'Success!'前看到Result = undefined'。 – Hacketo

+0

我確實看到它在控制檯中,現在我明白了!在我心中,javascript必須等待調用完成,然後才能在代碼中順序執行,謝謝! @Hacketo –

+0

對不起哈克託,我在回答之前沒有看到您的評論 – Ello

回答

2

第二個console.log在成功函數中的第一個之前被執行,因爲ajax是一個異步進程。您需要使用回調函數來確保第二個console.log在ajax調用後執行,或者您可以使用promises

1

讓我們來看看您的代碼在做什麼。

  1. 聲明變量myXML(= NULL)
  2. 開始的$就請求(並宣佈做什麼,如果它 - 最終,在未來的某個時刻 - 成功完成)
  3. 日誌的myXML

注意的內容,除非success回調點3.之前調用(這是非常不太可能),myXML在那時仍然是null

換句話說,當回調被調用時,myXML應該被更新。在此之前,您宣稱它是在第1點,即null。代碼完全按照你所要求的做,但它不是你想要的東西。