2014-11-30 6 views
0

Ok 나는 여기에서 찾을 수있는 다른 게시물을 체크했다는 말로 시작하고 싶다. 내 문제는 두 가지가 간단한 실수 였고 다른 하나는 PHP 세션 잠금과 관련이 있었고 세션을 사용하지 않았습니다.두 개의 동시적인 Ajax 호출 - 하나는 실행 중이 지 않거나 두 개의 콜백이 동일한 responseText를 반환 함

기본적으로 두 개의 서로 다른 페이지로 두 개의 Ajax 요청을 실행하고 기본 페이지 (요청 호출)가로드 된 후 서로 다른 방식으로 별도의 데이터를 사용하고 있습니다.

문제를 단순화하기 위해이 사이트를 jsFiddle을 사용했지만 HttpRequests로 재미있게 만들었습니다. The calling page | One of the pages being called | The second page being called

위에 링크 된 페이지의 출처는 내 예제에서 사용하고있는 코드이며 그 이상은 아무것도 아닙니다. 두 번째 ajax 호출은 첫 번째 링크에서 '#off'를 URL에 추가하여 해제 할 수 있습니다.

내 개인 Wamp 테스트 서버에서 볼 수있는 문제점은 Ajax 요청에 대한 두 콜백이 모두 실행 중이지만 기능에 전달 된 데이터가 동일하지 않아야한다는 것입니다. 첫 번째 콜백 함수와 두 번째 콜백 함수 모두 두 번째 호출에서 responseText를 수신합니다. 그러나이 웹 서버에서는 두 번째 콜백 만 실행되며 두 번째 ajaxCall이 꺼져 있지 않으면 (#off) 첫 번째 콜백이 전혀 실행되지 않습니다. 내 개인 서버와 온라인 서버 사이에는 약간의 차이가 있어야하지만 실제로는 재현 할 수 없습니다. 그러나 여전히 문제가 있으며 하나에 대한 해결책이 둘 모두에 대한 해결책 일 것이라고 추측합니다.

왜 이런 일이 일어 났는지 말해 줄 수 있습니까? HttpRequests가 어떻게 작동하는지 오해하고 있습니까? 아니면 내 코드에 구멍이 있습니까?


는 편집 :

<html> 

<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 

<script type="text/javascript" > 



function ajaxCall(dest, callBack, data, method, async, returnXML) { 
     method = typeof method !== 'undefined' ? method : "POST"; 
     async = typeof async !== 'undefined' ? async : true; 
     returnXML = typeof returnXML !== 'undefined' ? returnXML : false; 

     var ajax; 
     if (window.XMLHttpRequest) { 
     xmlhttp=new XMLHttpRequest(); 
     } 
     else { 
     xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); 
     } 
     xmlhttp.onreadystatechange=function() { 
     if (xmlhttp.readyState==4 && xmlhttp.status==200) { 
      returnXML ? callBack(xmlhttp.responseXML) : callBack(xmlhttp.responseText); 
     } 
     } 
     xmlhttp.open(method , dest, async); 
     if(method == "POST") 
     xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded"); 
     data === null ? xmlhttp.send() : xmlhttp.send(data); 
} 



$(document).ready(function() { 


ajaxCall("player.htm", function(html) { 
      $("#player").html("Player:<br>" + html);  
     }, null); 

if(location.hash != "#off") { 
ajaxCall("home.htm", function(html) { 
      $("#home").html("Home:<br>" + html);  
     }, null); 
} 


}); 


</script> 



<style type="text/css"> 

#wrapper { 
width: 215px; 

} 
#wrapper:after { 
content: ""; 
display:none; 
clear: both; 
} 
#player, #home { 
    width: 100px; 
    height: 100px; 
    border: 1px solid black; 
    margin-right: 5px; 
} 
#player {float: left;} 
#home {float:right;} 


</style> 



<div id="wrapper"> 
    <div id="player"></div> 
    <div id="home"></div> 
</div> 
</html> 

Home.htm :

I am the text from home.htm 

Player.htm :

I am the text from player.htm 

여기

코드입니다 몇 가지주의 할 :

  1. 이 예제는 원래 응용 프로그램의 매우 단순화 된 버전입니다 (결과 문제는 동일합니다 그래서 많은이기 때문에 원래의 예를 도시 내에서 아무 의미가 없다 코드 즉, 실제 응용 프로그램에서 요청 된 페이지 중 하나가 표시되고 차례로 AJAX 요청을 만들어 다른 요청의 콜백 내부에서 실행하는 것이 실제로 해결책이 아니며 측면에있는 것처럼 보입니다. 'ajaxCall'함수가 반드시 두 요청 객체를 섞어서는 안되기 때문에 문제를 해결해야합니다.

  2. 이미 긴 게시물을 더 길게 만들고 싶지 않았기 때문에 원래 소스를 포함하지 않았지만 모든 링크에서 사용할 수 있습니다.

  3. 정말 긴 게시물을 보내 주셔서 죄송합니다.하지만 제 문제에 대해 자세히 설명해야하며 지난 두 달 동안 내 머리를 짚고 있습니다.

  4. 변경 사항을 보려면 #off를 URL에 추가 한 후 페이지를 다시 클릭해야 할 수도 있습니다.

+0

실제 질문에 관련 코드를 붙여 넣으십시오. 찾으려면 시도하십시오. 여기서는 외부 참조가 충분하지 않다고 생각하고 100 번 더 많은 사람들이 귀하의 코드를 살펴 봅니다. 문제는 일반적으로 HTTP 요청이 아닌 코드에 있습니다. – jfriend00

+0

물론, 질문에 추가하십시오. 그냥 외부에서 읽는 것이 더 쉬울 것이라고 생각했습니다. – arch

+0

코드를 게시 했으므로 Bergi가 지적한 문제를 빨리 알 수 있습니다. 여러 요청에 대해 전역 변수를 재사용하므로 다른 변수를 덮어 씁니다. 항상 관련 코드를 게시하십시오. – jfriend00

답변

2

xmlhttp 변수는 implicitly global입니다. 이를 위해 var statement을 사용하십시오. 또는 식별자를 선언했지만 아직 사용하지 않은 var ajax과 섞어 보셨습니까?