2012-03-04 70 views
0

我有最奇怪的錯誤,我的Javascript函數行爲有所不同,具體取決於是否在特定行上設置警報。空警報更改函數行爲

基本上,代碼如下所示:

var friendsHtml = 'Error String'; 
$.get("url", function(xml){ 
    $(xml).find('friend').each(function(){ 
     friendsHtml = 'html stuff'; 
    }); 
}); 
var div = '<div>'+friendsHtml+'</div>'; 
$("#friends_window").html(div); 

這將始終顯示錯誤字符串,而不是HTML字符串。 但是,當我在這條線添加一個空的警告,一切都運行得很好:

var friendsHtml = 'Error String'; 
$.get("url", function(xml){ 
    $(xml).find('friend').each(function(){ 
     friendsHtml = 'html stuff'; 
    }); 
}); 
alert(""); 
var div = '<div>'+friendsHtml+'</div>'; 
$("#friends_window").html(div); 

我真的不明白這一點。

回答

2

alert阻止(「暫停」)函數的執行,但不執行AJAX請求。

因此,當您點擊「確定」關閉警報對話框時,請求可能已經完成,然後變量通過jQuery.get中的回調方法進行更改。

的可視化:

// Case 1 
var friendsHtml = 'Error String'; 
< sending AJAX request... > 
var div = '<div>'+friendsHtml+'</div>'; // <AJAX request hasn't finished yet 
             // so "Error String" is printed. 
// Case 2: 
... 
< sending AJAX request > 
alert("");       // <-- Blocks execution 
            // Meanwhile, AJAX request finishes 
            // and changes friendsHtml to "html stuff" 
< User dismisses dialog, and the execution is resumed > 
var div = '<div>'+friendsHtml+'</div>'; // <-- "html stuff" 
+0

當然!我必須提出一個同步的請求才能工作。 – Dreiven 2012-03-04 21:31:44

+1

@Dreiven儘可能避免同步請求,因爲在請求完成之前它們會阻塞用戶界面。你的代碼看起來不那麼重要,所以使用正確編碼的回調方法的異步請求應該很好地完成這項工作。 – 2012-03-04 21:33:10

0

我認爲正在發生的事情是允許的$.get()完成之前的股利正在更新。你可以把div更新代碼放在$.get()的回調函數中。您可能需要在回調中進一步進行錯誤檢查,以確保您的$(xml).find()正在返回您期望的結果。