2012-03-04 63 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()正在返回您期望的结果。