Вопрос

Моя проблема - следующая. Я написал класс ajaxengine, который создает в конструкторе новый объект xmlhttprequest. Класс содержит метод, называемый respenseAnalyser, который вызывается, когда изменился «OneReadyStateChange» объекта Xmlhttprequest. Итак, теперь я создал, скажем, 4 экземпляра ajaxengine => 4 xmlhttprequest объектов.

Теперь у меня есть еще один класс DataRequester, который имеет Attribute DataReq, который содержит экземпляры AjaxEngine. Во всей программе есть только один экземпляр DatAreqeuster! DatareQuester имеет функцию CallWhenFined. Функция называется функцией ответа ахаксера и уменьшает переменную экземпляра 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 BIBITORD

Пул гарантирует, что запросы выполняются в приказе, который вы им предоставили (хотя, конечно, они могут быть возвращены в любом порядке в зависимости от производительности), используя столько одновременных запросов, сколько вы определяете (в соответствии с ограничениями системы). Вы можете создать создание нескольких пулов для разных целей.

Если ничего другого, это может дать вам некоторые идеи.

Другие советы

Прежде всего: большинство браузеров, ориентированных на AJAX, поддерживают только 2 одновременных запроса в одном и том же домене ». Так что, если вы начнете 4, то 2 из них будут представлены.

Вы DataReqeuster / Singleton / можете иметь массив переменной «тест», поэтому вместо того, чтобы совместно использовать отдельную переменную на нескольких экземплярах, создайте несколько экземпляров данных. Таким образом, для расчета результата вам нужно будет суммировать массив «Тест».

Вам нужно будет реализовать импровизированную мутекс (идея состоит в том, что эвристика проверит на лоп и установит ее на True, если она ложна, то делайте тело, в противном случае сон (settimeout?) - это, очевидно, довольно плохая эвристика, которую никто не будет реализовать Поскольку это не безопасно нить, но это общая концепция того, как вы все равно имели бы дело с условиями гонки).

Я полагаю, что есть, по крайней мере, один пример создания мутекс в Интернете, но я не оглядывался в подробности - у него есть некоторые хулители, но я не знаю другого способа достижения «безопасности нити» в JavaScript. Мне никогда не нужно было реализовать «безопасность потоков» JS, но я начинаю искать, если бы мне пришлось иметь дело с условиями гонки в JavaScript.

Вы не можете сделать мутекс в JavaScript просто потому, что на самом деле нет встроенной функции сна.

Видеть: Есть ли эквивалентная функция JavaScript или JQuery Sleep?

Кроме того, нет никакого способа убедиться, что логический флаг в вашем Mutex не обращается в то же время, что и в другую ветку, сама логика нуждается в Mutex ... и так далее и так далее. Вам понадобится что -то вроде синхронизированного ключевого слова в Java, которое будет доступно в JavaScript, и этого просто не существует. У меня были ситуации, когда я беспокоился о безопасности потоков, но в любом случае с кодом с альтернативным планом, если произошла ошибка, но это еще не произошло.

Поэтому мой совет, если вы получаете ошибку, это, вероятно, не из -за условия гонки.

Что вы думаете о следующей статье? Я только что нашел это в Google

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top