2009-08-14 4 views
0

내 문제는 다음과 같습니다. 생성자에 새로운 XMLHttpRequest 객체를 생성하는 클래스 AJAXEngine을 작성했습니다. 이 클래스에는 responseAnalyser라는 메서드가 포함되어 있으며이 메서드는 XMLHttpRequest 객체의 "onreadystatechange"가 변경 될 때 호출됩니다. 그래서 이제는 AJAXEngine의 인스턴스 4 개 => 4 개의 XMLHttpRequest 객체를 만들 수있게되었습니다.여러 AJAX 요청으로 인종 상황

이제는 AJAXEngine의 인스턴스를 보유하고있는 배열 속성 dataReq가있는 다른 클래스 인 DataRequester가 있습니다. 전체 프로그램에는 DataReqeuster 인스턴스가 하나만 있습니다! DataRequester에는 callWhenFinished라는 함수가 있습니다. 이 함수는 AJAXEngine의 responseAnalyser 함수에 의해 호출되고 DataRequester 인스턴스의 변수를 감소시킵니다.

하지만 경기 상황이 발생했다고 생각합니다. JavaScript로 어떻게 그들을 prefent 수 있습니까? 모든

function AJAXEngine 
{ 
this.httpReqObj = //create new XMLHttpRequest Object 
this.obj; 
this.func; 
} 
AJAXEngine.prototype.responseAnalyser = function() 
{ 
if(this.httpReqObj.readState == 4) 
{ 
    this.func.call(this.obj); 
} 
} 
AJAXEngine.prototype.fireReq = function(o, f) 
{ 
this.obj = o; 
this.func = f; 
// fire ajax req 
} 

function DataRequester() 
{ 
this.dataReq = new Array(); 
this.test = 4; 

for(var i = 0; i < 4; i ++) 
{ 
    this.dataReq[i] = new AJAXEngine(); 
} 
} 
DataRequester.prototype.callWhenFinished = function() 
{ 
this.test --; 
} 

답변

1

이 도움이 될 경우 확실하지

구글

에서 그것을 발견하지만, 관리되는 연결 풀을 만들려고 것 같습니다.나는 한 몇 년 전에했던 여전히 잘 여기서 일하는 것을 :

DP_RequestPool Library

풀 요청은 물론, 그들이 어떤 순서로 반환 될 수 있습니다,하지만 당신은 (을 제공 한 순서대로 수있게 해줍니다

성능에 따라) 시스템 요구 사항에 따라 여러 개의 동시 요청을 사용할 수 있습니다. 다른 용도로 여러 풀을 인스턴스화 할 수 있습니다.

다른 방법이 있으면 아이디어를 얻을 수 있습니다.

+0

내가 소스를 찾을 수있는 링크를 내게 줄 수 있습니까? –

+0

링크가 답변에 있습니다 - 문제가 있습니까? 여기에 마크 업이 없습니다 : http://www.depressedpress.com/Content/Development/JavaScript/Extensions/DP_RequestPool/Index.cfm 다운로드 링크는 페이지의 첫 번째 섹션에 있습니다. –

+0

안녕하세요, 예. 문제가 있습니다. 링크를 클릭 할 때마다 "요청 처리 중 오류가 발생했습니다"라는 제목의 파란색 상자가 나타납니다. 요소 DP는 클래스 유형 [Ljava.lang.String; –

0

첫째 : AJAX 지향 브라우저의 대부분은 "같은 도메인 만 2 개 동시 요청을"규칙을 지원합니다. 그래서 네가 시작하면 그 중 2 명이 보류됩니다.

DataReqeuster/singleton /은 변수 'test'의 배열을 가질 수 있으므로 여러 인스턴스에서 단일 변수를 공유하는 대신 데이터의 여러 인스턴스를 만듭니다. 따라서 결과를 계산하려면 'test'배열을 합산해야합니다.

0

임시 변통 뮤텍스를 구현해야합니다. (휴리스틱 스가 bool을 검사하고 false이면 false로 설정하고, 그렇지 않으면 sleep (settimeout?) - 이것은 상당히 나쁜 경험적 방법입니다. 아무도 스레드로부터 안전하지 않으므로 구현할 사람은 없지만 어쨌든 경쟁 조건을 어떻게 처리 할 것인지 일반적인 개념입니다.

웹상에 뮤텍스를 만드는 예제가 하나 이상 있다고 생각합니다. 그러나 세부적으로 살펴 보지는 않았습니다 - 일부 비방자가 있지만 자바 스크립트에서 '스레드 안전성'을 얻는 다른 방법을 알지 못합니다. 나는 js 'thread-safety'를 구현할 필요가 없었지만 자바 스크립트에서 경주 조건을 처리해야하는지 살펴보기 시작했다.

0

자바 스크립트에서 뮤텍스를 사용할 수없는 이유는 실제로 사용할 수있는 휴면 기능이 없기 때문입니다.

은 참조 : 또한 Is there an equivalent Javascript or Jquery sleep function?

, 뮤텍스의 부울 플래그가 다른 스레드와 동시에 액세스되는되지 않도록 할 수있는 방법이 없다, 부울 자체는 뮤텍스가 필요합니다 ... 그리고 등등. 당신은 자바 스크립트에서 사용할 수있는 자바의 동기화 된 키워드와 같은 것이 필요하고 이것은 단순히 존재하지 않습니다. 스레드 안전성에 대해 걱정할만한 상황이 있었지만 오류가 발생하더라도 대체 계획이있는 코드는 언제든지 발생합니다.

내 충고는 오류가 발생하는 경우입니다. 경쟁 조건 때문이 아닐 수도 있습니다.

관련 문제