Pregunta

Mi problema es el siguiente. Escribí una clase AjaxEngine, que crea en el constructor un nuevo objeto xmlhttprequest. La clase contiene un método llamado ResponseAnalySer, que se llama cuando el "OnreadyStateChange" del objeto XMLHTTPREQUEST ha cambiado. Así que ahora creé vamos a decir 4 instancias de Ajaxengine => 4 objetos XMLHTTPREQUEST.

Ahora tengo otra clase dataRequester, que tiene un dataReq de matriz-atributo, que contiene las instancias de Ajaxengine. ¡Solo hay una instancia de dataReqeuster en todo el programa! DataRequester tiene una función llamada llamada whenfinished. La función se llama, por la función ResponseAnalySer de AjaxEngine y disminuye una variable de la instancia de DataRequester.

Pero, creo que suceden condiciones de carrera. ¿Cómo podría prefirirlos en 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 --;
}
¿Fue útil?

Solución

No estoy seguro de si esto ayudaría, pero parece que estás tratando de crear un grupo de conexión administrado. Hice uno hace unos años que todavía funciona bien aquí:

Biblioteca dp_requestpool

El grupo asegura que las solicitudes se realicen en el orden que les haya proporcionado (aunque, por supuesto, se pueden devolver en cualquier orden en función del rendimiento) utilizando tantas solicitudes simultáneas como define (sujeto a las limitaciones del sistema). Puede instanciar múltiples grupos para diferentes fines.

Si nada más, esto podría darle algunas ideas.

Otros consejos

En primer lugar: la mayoría de los navegadores orientados a AJAX admiten la Convención "solo 2 solicitudes simultáneas al mismo dominio". Entonces, si comienzas 4, 2 de ellos serán pendientes.

You Dataareqeuster / Singleton / puede tener una matriz de 'prueba' variable, por lo que en lugar de compartir una única variable en múltiples instancias, cree múltiples instancias de datos. Entonces, para calcular el resultado, deberá sumar una matriz de 'prueba'.

Tendría que implementar un mutex improvisado (la idea es que una heurística verificaría un bool y lo establecería en verdadero si es falso, entonces el cuerpo, de lo contrario duerme (¿settimeout?). Esto es obviamente una heurística bastante mala que nadie implementaría Como no es seguro, pero ese es el concepto general de cómo lidiaría con las condiciones de carrera de todos modos).

Creo que al menos un ejemplo de crear un mutex en la web, pero no lo he revisado en detalle: tiene algunos detractores, pero no soy consciente de otra forma de lograr la 'seguridad de los hilos' en JavaScript. Nunca he necesitado implementar JS 'Thread-Safety', pero eso es comenzar a buscar si tenía que lidiar con las condiciones de carrera en JavaScript.

No puede hacer un mutex en JavaScript simplemente porque realmente no hay una función de sueño incorporada disponible.

Ver: ¿Existe una función de sueño JavaScript o jQuery equivalente?

Además, no hay forma de asegurarse de que no se acceda a la bandera booleana en su mutex al mismo tiempo que otro hilo, el booleano mismo necesita un mutex ... y así sucesivamente. Necesitaría algo como la palabra clave sincronizada en Java para estar disponible en JavaScript y esto simplemente no existe. He tenido situaciones en las que estaba preocupado por la seguridad de los hilos, pero cuando con el código de todos modos con un plan alternativo si ocurrió un error, pero eso aún no ha sucedido.

Entonces, mi consejo es que si recibe un error, probablemente no sea por una condición de carrera.

¿Qué opinas sobre el siguiente artículo? Lo acabo de encontrar en Google

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top