Domanda

Il mio problema è il seguente. Ho scritto una classe AjaxEngine, che crea nel costruttore un nuovo oggetto XMLHTTPREQUEST. La classe contiene un metodo chiamato Respondeanalyser, che viene chiamato quando è cambiato l'oggetto "onreadystatechange" dell'oggetto XMLHTTPREQUEST. Quindi ora ho creato dicendo 4 istanze di ajaxengine => 4 xmlhttprequest.

Ora ho un'altra classe DatareQuester, che ha un Array-Attribute Datareq, che contiene le istanze di AjaxEngine. C'è solo un'istanza di DataReqeuster in tutto il programma! DataRequester ha una funzione chiamata CallWhenfiniture. La funzione è chiamata dal responsabile della funzione di AjaxEngine e diminuisce una variabile dell'istanza DatareQuester.

Ma penso che siano avvenute condizioni di razza. Come potrei prefiggerli in 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 --;
}
È stato utile?

Soluzione

Non sono sicuro se questo possa aiutare, ma sembra che tu stia cercando di creare un pool di connessioni gestito. Ne ho fatto uno qualche anno fa che funziona ancora bene qui:

Biblioteca DP_Requestpool

Il pool garantisce che le richieste vengano effettuate nell'ordine che le hai fornite (anche se, ovviamente, potrebbero essere restituite in qualsiasi ordine in base alle prestazioni) utilizzando tutte le richieste simultanee che si definiscono (soggetto a limitazioni di sistema). Puoi istanziare più pool per scopi diversi.

Se non altro, questo potrebbe darti alcune idee.

Altri suggerimenti

Prima di tutto: la maggior parte dei browser orientati all'AJAX supportano la convenzione "Solo 2 richieste simultanee allo stesso dominio". Quindi, se inizi 4, verranno presi 2 di loro.

DEATERQEUSTER / SINGLETON / Puoi avere una matrice di "test" variabile, quindi invece di condividere una singola variabile in più istanze, creare più istanze di dati. Quindi, per calcolare il risultato dovrai sommare l'array "test".

Avresti bisogno di implementare un mutex improvvisato (l'idea è che un euristico verificherebbe un bool e lo metterà su vero se è falso allora fare il corpo, altrimenti dormire (settimeout?) - Questo è ovviamente un euristico piuttosto brutto che nessuno implederebbe Dato che non è sicuro, ma questo è il concetto generale di come faresti comunque alle condizioni della gara).

Credo che ci sia almeno un esempio di creazione di un mutex sul web, ma non l'ho esaminato in dettaglio - ha alcuni detrattori, ma non sono a conoscenza di un altro modo per ottenere "sicurezza dei fili" in JavaScript. Non ho mai avuto bisogno di implementare la "sicurezza thread" di JS, ma questo è iniziare a cercare se avessi avuto a che fare con le condizioni di gara in JavaScript.

Non puoi fare un mutex in JavaScript semplicemente perché in realtà non esiste una funzione di sonno incorporata.

Vedere: Esiste una funzione JavaScript o jQuery equivalente?

Inoltre, non c'è modo di garantire che la bandiera booleana nel tuo mutex non venga accessibile contemporaneamente a un altro thread, il booleano stesso ha bisogno di un mutex ... e così via e così via. Avresti bisogno di qualcosa come una parola chiave sincronizzata in Java per essere disponibile in JavaScript e questo semplicemente non esiste. Ho avuto situazioni in cui ero preoccupato per la sicurezza dei thread, ma quando con il codice comunque con un piano alternativo se si è verificato un errore ma ciò deve ancora accadere.

Quindi il mio consiglio è se stai ricevendo un errore, probabilmente non è a causa di una condizione di gara.

Cosa ne pensi del seguente articolo? L'ho appena trovato in Google

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top