2011-08-18 4 views
1

다음 이유를 이해하려고합니다.왜 자바 스크립트 비동기 응답이 중복됩니까?

for 루프 내에서 여러 비동기 요청을 시작한 다음 응답을 간단히 인쇄합니다. 여기에 내가 뭘하는지 매우 단순화 된 버전입니다 :

function getStuff(){ 
    var singers = ['marley','matthews','johnson','buffett']; 
    for(lastname in singers){ 
     var lastName = singers[lastname]; 
     log("Making request for "+ singers[lastname]); 
     makeAsyncRequest(singers[lastname], function(response){ 
       //this is the callback when the async request returns 
       log("RESPONSE - "+lastName+": "+response); 
     }); 
    } 
} 

나는 syncronously (비동기 : false)를 사용하여 코드를 실행하면, 때마다 예상대로 나는 다음과 같은 결과를 얻을 :

Making request for marley 
Making request for matthews 
Making request for johnson 
Making request for buffett 
RESPONSE - marley: bob 
RESPONSE - johnson: jack 
RESPONSE - matthews: dave 
RESPONSE - buffett: jimmy 

비동기 적으로 실행되면 다음과 같은 결과가 표시됩니다. 나는 응답이 잘못되어 돌아올 수도 있음을 이해한다. 그러나 내가 이해할 수없는 것은 그들이 순서를 벗어나서 돌아 왔을 때 왜 중복 값을 보았는가하는 것입니다. 예를 들어 다음과 같이 표시 될 수 있습니다.

Making request for marley 
Making request for matthews 
Making request for johnson 
Making request for buffett 
RESPONSE - marley: bob 
RESPONSE - johnson: dave 
RESPONSE - matthews: dave 
RESPONSE - buffett: jimmy 

알림 'dave'가 두 번 표시되는 것 같습니다.

Making request for marley 
Making request for matthews 
Making request for johnson 
Making request for buffett 
RESPONSE - marley: bob 
RESPONSE - johnson: dave 
RESPONSE - matthews: jack 
RESPONSE - buffett: jimmy 

그러나 콜백에서 "응답"PARAM가 같은 값으로 설정지고있는 것으로 보인다 왜 이해가 안 : 값 '잭'과 '데이브'전환한다면 나는 그렇게 같이 이해할 수 두번? 나는 여기서 기본적인 것을 간과하고 있는가?

도움 주셔서 감사합니다.

+2

당신이 추가 시도해 볼 수도 있습니다'{캐시 : 거짓}'아약스 요청에

해결책은 루프에 추가로 폐쇄 될 수 있을까? – pimvdb

+0

감사합니다. {cache : false}를 추가했는데 자주 사용하지 않는 것 같았습니다.하지만 브라우저가 어떻게 든 캐시되고 있다고 생각합니까? – Upgradingdave

답변

1

루프를 :

그래서 해결책은 JQuery와 쿠키 플러그인을 사용하고과 같이 각 요청에 대한 JSESSIONID를 제거 할 수 있는지 확인하는 것이 었습니다. 문제는 lastName 변수가 하나 뿐이므로 비동기 요청이 반환 될 때 해당 내용이 항상 반복에서 지정한 내용이 아닐 수 있습니다.

how the scope in JavaScript works을 읽고 이해해야합니다.

function getStuff(){ 
    var singers = ['marley','matthews','johnson','buffett']; 
    for(lastname in singers) { 
     function(lastName) { 
      log("Making request for "+ lastName); 
      makeAsyncRequest(lastName, function(response) { 
        //this is the callback when the async request returns 
        log("RESPONSE - "+lastName+": "+response); 
      }); 
     }(singers[lastname]); 
    } 
} 
-1

경쟁 조건이 있습니다. 응답 핸들러 내의 가수 [이름] 값은 for() 루프가있는 상태에 따라 달라집니다. 비동기 요청을 수행하면 요청이 지연 될 경우 완전히 동기화되지 않을 수 있습니다 (net.burp , 느린 서버, 등등 ...).

+0

감사합니다. 예제를 업데이트 했으므로 더 이상 문제가되지 않습니다.그러나 나는 가수로 정말 애송이 지 않습니다. 응답 핸들러가 호출 될 때마다 왜 '응답'이 고유하지 않은지에 대해 더 염려합니다.이 시점에서 내 가장 좋은 추측은 어딘가에 캐싱 될 가능성이 있습니다. . – Upgradingdave

+0

이것은 경쟁 조건과 아무런 관련이 없습니다. – Frunsi

0

는 for 루프의 LASTNAME의 사본을 유지하려고 :이 경우

function getStuff() 
{ 
    var singers = ['marley','matthews','johnson','buffett']; 
    for(lastname in singers) 
    { 
     var currentName = lastname; 
     log("Making request for "+ singers[currentName]); 
     makeAsyncRequest(singers[lastname], function(response) 
     { 

      //this is the callback when the async request returns 
      log("RESPONSE - "+singers[currentName ]+": "+response); 
     }); 
    } 
} 
+0

이 중 도움이되지 않습니다 (내 대답 참조) – Frunsi

-1

가 원격 나머지 서비스는 기본 인증이 필요합니다. 루프를 통해 매번 다른 사용자 이름과 암호를 보냈습니다. 나는 마침내 기본 인증 자격 증명이 서버 측에서 캐시되고 있음을 깨달았습니다.

서버 측에서는 서비스가 JSESSIONID라는 유효한 쿠키를 찾으면 http 요청 헤더의 기본 인증 사용자 이름과 암호를 무시합니다. 자신의 범위가없는

$.cookie('JSESSIONID', null {path: '/pathToCookie'}); 
관련 문제