2013-01-15 61 views
-2

我有以下JavaScript代碼,我試圖從WebAPI項目中的某個操作獲取一些數據。我遇到的問題是,當我使用數據集變量時,出現錯誤,指出該數據集未定義。另外,我希望我的警報1號先發射,但是2號警報首先發射,數據集未定義,然後2號警報發射,然後它包含我的數據。我在這裏做錯了什麼?

<script type="text/javascript"> 
    $().ready(function() { 
     var dataset; 
     $.get("http://localhost:9619/api/values", function(data) { 
      dataset = data; 
      alert("No. 1 " + dataset); 
     }); 

     alert("No. 2 " + dataset); 
    }); 
</script> 
+2

這是由於AJAX的異步性質。 SO在這裏有幾百萬個帖子來解決這個問題。 –

+1

由於「Ajax」的「A」部分,它發生「無序」。 –

+0

[你如何讓JavaScript代碼執行\ *依次爲*](http:// stackoverflow。COM /問題/ 2637626 /怎麼辦 - 你 - 做的JavaScript代碼,執行,按順序) –

回答

1

$.get()是異步的。因此,回調的執行會延遲到請求完成。

執行順序,你的情況是這樣的:

1. start the get request 
2. alert("No. 2 "); 
3. [request has finished] execute the callback: alert("No. 1 "); 

您應該添加所有代碼的$.get()請求到相應的回調依賴。這樣你就可以確保請求已經成功並且你的變量已經設置好了。

另一個不太可取的解決方案是使用$.ajax()並將其參數async設置爲false。但在這種情況下,所有JavaScript代碼的執行都會等待,直到您的請求完成並且您的頁面同時凍結。

0

警報No. 2應首先觸發值爲undefined,因爲ajax請求是異步的。之後,您應該收到來自請求的價值No. 1。你可以通過使用同步ajax請求來獲得你期望的行爲(不好的做法)。

試試這個:

$().ready(function() { 
    var dataset; 
    $.ajax({ 
     url: 'http://localhost:9619/api/values', 
     success: function(result) { 
        dataset = data; 
        alert("No. 1 " + dataset); 
       }, 
     async: false 
    }); 
    alert("No. 2 " + dataset); 
}); 

同步請求。

0

$ .get是「異步」,因爲它不會在繼續之前等待它完成。第二個參數是回調函數(這就是你已經把

alert("No. 1 " + dataset); 

什麼情況是,當你運行

$.get("http://localhost:9619/api/values", function(data) 

會立即切換到下一行:

alert("No. 2 " + dataset); 

然後當AJAX調用完成時,它將運行回調函數,該函數運行

dataset = data; 
alert("No. 1 " + dataset); 

這裏有異步JavaScript一個很好的演示:Writing Asynchronous Javascript 101

0

由於$獲得()是一個異步調用它作爲控制達到有越來越儘快解僱,因爲它在本質上是異步的,它不需要等待才能完成通話。所以控制權轉移到你的下一個警報(並且ajax調用可能還在完成中)。

相關問題