2012-03-04 4 views
0

이상한 버그가 있습니다. 내 Javascript 기능은 특정 회선에 경고가 설정되어 있는지 여부에 따라 다르게 작동합니다.비어있는 알림 기능 변경 동작

는 기본적으로 코드는 다음과 같습니다 : 항상 오류 문자열이 아닌 HTML 문자열을 표시합니다

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); 

합니다. 하지만 난이 줄의 빈 경고를 추가 할 때, 모든 것이 잘 작동 :

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 요청이 아닌 해당 함수의 실행을 차단 ("일시 중지")합니다.

경고 대화 상자를 닫으려면 "OK"를 클릭하면 요청이 완료되었을 수 있으며 변수는 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

+1

@Dreiven 동기 요청은 요청이 완료 될 때까지 사용자의 인터페이스를 차단하므로 가능하면 피해야합니다. 코드가 중요하지 않으므로 적절하게 코딩 된 콜백 메소드를 사용하는 비동기 요청은 작업을 잘 수행해야합니다. –

0

나는 무슨 일이 일어나고 것은 $.get()이 완료 허용되기 전에 사업부가 업데이트되고 있음을 생각합니다. $.get()에 대한 콜백 함수 안에 div 업데이트 코드를 넣을 수 있습니다. 콜백 내부에서 추가로 오류 검사를 수행하여 $(xml).find()이 예상 한 값을 반환하는지 확인해야 할 수 있습니다.