문제

내 문제는 다음과 같습니다. 나는 Class AjaxEngine을 썼는데, 이는 생성자에 새로운 xmlhttprequest 객체를 만듭니다. 이 클래스에는 XMLHTTPREQUEST 객체의 "OnreadyStateChange"가 변경 될 때 호출되는 ResponseAnalyser라는 메소드가 포함되어 있습니다. 이제 나는 4 개의 인스턴스의 ajaxEngine => 4 xmlhttprequest 객체를 만들었습니다.

이제 AjaxEngine의 인스턴스를 보유한 배열 부여 Datareq가있는 다른 클래스 Datarequester가 있습니다. 전체 프로그램에는 datareqeuster의 인스턴스가 하나뿐입니다! Datarequester는 Callfinished라는 기능이 있습니다. 이 함수는 AjaxEngine의 함수 응답자에 의해 호출되며 Datarequester 인스턴스의 변수를 감소시킵니다.

그러나 나는 인종 조건이 발생한다고 생각합니다. JavaScript에서 어떻게 프리 퍼를 할 수 있습니까?

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 --;
}
도움이 되었습니까?

해결책

이것이 도움이 될지 확실하지 않지만 관리 된 연결 풀을 만들려고하는 것처럼 보입니다. 나는 몇 년 전에 여기에서 여전히 잘 작동했습니다.

DP_RequestPool 라이브러리

풀은 귀하가 제공 한 순서대로 요청이 이루어 지도록 보장합니다 (물론 시스템 제한에 따라)만큼 많은 동시 요청을 사용하여 (물론 성능에 따라 모든 순서로 반환 될 수 있음). 여러 목적으로 여러 풀을 인스턴스화 할 수 있습니다.

다른 것이 없다면 이것이 당신에게 몇 가지 아이디어를 줄 수 있습니다.

다른 팁

우선 : 대부분의 Ajax 지향 브라우저는 "동일한 도메인에 대한 2 개의 동시 요청"을 지원합니다. 따라서 4 번 시작하면 2 개가 급증 할 것입니다.

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

당신은 임시 변통 뮤트를 구현해야 할 것입니다 (아이디어는 휴리스틱이 부울을 점검하고 거짓이라면 진실로 설정한다는 것입니다. 스레드 안전하지는 않지만 이것이 어쨌든 레이스 조건을 어떻게 다룰 것인지에 대한 일반적인 개념입니다).

나는 웹에서 뮤텍스를 만드는 것의 적어도 하나의 예가 있다고 생각하지만, 그것을 자세히 살펴 보지 않았다 - 그것은 일부 detractors가 있지만, JavaScript에서 '스레드 안전'을 달성하는 다른 방법을 알지 못한다. JS '스레드 안전성'을 구현할 필요는 없었지만 JavaScript에서 인종 조건을 다루어야한다면보기 시작합니다.

수면 기능이 내장되어 있지 않기 때문에 JavaScript에서 Mutex를 수행 할 수 없습니다.

보다: 동등한 JavaScript 또는 JQuery 수면 기능이 있습니까?

또한 뮤텍스의 부울 깃발이 다른 스레드와 동시에 액세스되지 않도록하는 방법은 없습니다. 부울 자체는 뮤트가 필요합니다. JavaScript에서 사용할 수 있으려면 Java의 Synchronized Keyword와 같은 것이 필요합니다. 이는 단순히 존재하지 않습니다. 스레드 안전성에 대해 걱정하는 상황이 있었지만 오류가 발생했지만 아직 발생하지 않은 경우 대체 계획을 가지고 코드를 사용하면 대체 계획이있었습니다.

그래서 제 조언은, 당신이 오류가 발생한다면, 아마도 인종 조건 때문이 아닙니다.

다음 기사에 대해 어떻게 생각하십니까? 방금 Google에서 찾았습니다

http://www.developer.com/lang/jscript/article.php/3592016

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top