Frage

Mein Problem ist das folgende. Ich habe eine Klasse AjaxEngine geschrieben, die im Konstruktor ein neues XMLHTTPrequest -Objekt erstellt. Die Klasse enthält eine Methode namens ResponTeanalyseser, die als "OnReadyStatechange" des XMLHTTPrequest -Objekts bezeichnet wird. Also habe ich jetzt 4 Instanzen von ajaxengine => 4 xmlhttprequest -Objekte erstellt.

Jetzt habe ich eine andere Klasse Datarequester, die über einen Array-Attribute-Datareq verfügt, der die Instanzen von Ajaxengine enthält. Es gibt nur eine Instanz von Datareqeuster im gesamten Programm! Datarequester hat eine Funktion namens CallwhenFineed. Die Funktion wird durch den Funktionsreaktealyser von AjaxEngine aufgerufen und eine Variable der Datarequester -Instanz verringert.

Aber ich denke, es passiert Rassenbedingungen. Wie könnte ich sie in JavaScript vorbeziehen?

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 --;
}
War es hilfreich?

Lösung

Ich bin mir nicht sicher, ob dies helfen würde, aber es sieht so aus, als würden Sie versuchen, einen verwalteten Verbindungspool zu erstellen. Ich habe vor ein paar Jahren einen gemacht, der hier immer noch gut funktioniert:

Dp_requestpool bibliothek

Der Pool stellt sicher, dass Anfragen in der Reihenfolge gestellt werden, in der Sie sie erteilt haben (obwohl sie natürlich in jeder Reihenfolge basierend auf der Leistung zurückgegeben werden können) mit ebenso vielen gleichzeitigen Anfragen, wie Sie definieren (vorbehaltlich von Systembeschränkungen). Sie können mehrere Pools für verschiedene Zwecke instanziieren.

Wenn nichts anderes, könnte dies Ihnen einige Ideen geben.

Andere Tipps

Zunächst: Die meisten von AJAX-orientierten Browsern unterstützen die Konvention "nur 2 gleichzeitige Anfragen an dieselbe Domäne". Wenn Sie also 4 starten, werden 2 von ihnen angesehen.

Sie datareqeuster / Singleton / können ein Array von Variablen -Test haben. Erstellen Sie daher anstelle einer einzelnen Variablen über mehrere Instanzen mehrere Dateninstanzen. Um das Ergebnis zu berechnen, müssen Sie das "Test" -Array summieren.

Sie müssten einen provisorischen Mutex implementieren (die Idee ist, dass eine Heuristik nach einem BOOL achten und es auf wahr setze, wenn es falsch ist, dann den Körper zu tun, sonst schlafen (setTimeout?) - Dies ist offensichtlich eine ziemlich schlechte Heuristik, die niemand umsetzen würde Da es nicht sicher fädel sicher ist, aber das ist das allgemeine Konzept, wie Sie mit den Rennbedingungen sowieso umgehen würden).

Ich glaube, es gibt mindestens ein Beispiel für das Erstellen eines Mutex im Web, aber ich habe nicht im Detail darüber nachgeschlagen - es hat einige Kritiker, aber ich bin mir nicht bewusst, wie ich in JavaScript 'Thread -Sicherheit' erreichen kann. Ich musste noch nie JS 'Thread-Safety' implementieren, aber ich fange an zu suchen, ob ich mich mit Rennbedingungen in JavaScript befassen musste.

Sie können in JavaScript keinen Mutex machen, nur weil es wirklich keine integrierte Schlaffunktion zur Verfügung steht.

Sehen: Gibt es eine äquivalente JavaScript- oder JQuery -Schlaffunktion?

Es gibt auch keine Möglichkeit, sicherzustellen, dass auf die Boolesche Flagge in Ihrem Mustex nicht gleichzeitig zugegriffen wird wie ein anderer Thread, der Boolesche selbst dann einen Mutex braucht ... und so weiter und so weiter. Sie würden so etwas wie synchronisiertes Schlüsselwort in Java benötigen, um in JavaScript verfügbar zu sein, und dies gibt es einfach nicht. Ich hatte Situationen, in denen ich mir Sorgen um die Sicherheit von Thread machte, aber wenn der Code sowieso mit einem alternativen Plan aufgetreten ist, wenn ein Fehler aufgetreten ist, aber das noch nicht geschehen ist.

Mein Rat ist also, wenn Sie einen Fehler bekommen, ist es wahrscheinlich nicht wegen einer Rennbedingung.

Was denkst du über den folgenden Artikel? Ich habe es gerade in Google gefunden

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top