Question

Mon problème est ce qui suit. J'ai écrit une classe AjaxEngine, qui crée dans le constructeur un nouvel objet XMLHTTPRequest. La classe contient une méthode appelée ResponseAnalyser, qui est appelée lorsque l'objet "OnReadyStateChange" de l'objet XMLHTTPRequest a changé. Alors maintenant, j'ai créé, disons 4 instances d'AjaxEngine => 4 objets XMLHTTPRequest.

Maintenant, j'ai une autre classe DatareQuester, qui dispose d'un DataRareq d'attribut d'arrêt, qui contient les instances d'AjaxEngine. Il n'y a qu'une seule instance de DatareQeuster dans l'ensemble du programme! DataRareQester a une fonction appelée call -finished. La fonction est appelée, par la fonction ResponseAnalyser d'AjaxEngine et diminue une variable de l'instance de DataRareQester.

Mais, je pense qu'il arrive des conditions de course. Comment pourrais-je les préfrendre 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 --;
}
Était-ce utile?

La solution

Je ne sais pas si cela aiderait, mais il semble que vous essayez de créer un pool de connexion géré. J'en ai fait un il y a quelques années qui fonctionne toujours bien ici:

Bibliothèque dp_requestpool

Le pool garantit que les demandes sont faites dans l'ordre que vous leur avez fourni (bien que, bien sûr, ils puissent être retournés dans n'importe quelle commande en fonction des performances) en utilisant autant de demandes simultanées que vous définissez (sous réserve des limitations du système). Vous pouvez instancier plusieurs pools à différentes fins.

Si rien d'autre, cela pourrait vous donner quelques idées.

Autres conseils

Tout d'abord: la plupart des navigateurs orientés ajax prennent en charge la convention "seulement 2 demandes simultanées au même domaine". Donc, si vous commencez 4, alors 2 d'entre eux seront en suspens.

Vous DatareQeuster / Singleton / Vous pouvez avoir un tableau de «test» variable, donc au lieu de partager une variable unique sur plusieurs instances, créez plusieurs instances de données. Donc, pour calculer le résultat, vous devrez additionner le tableau «test».

Vous auriez besoin de mettre en œuvre un mutex de fortune (l'idée est qu'une heuristique vérifiera un bool et le définirait sur true s'il est faux, alors le corps, sinon le sommeil (settimeout?) - C'est évidemment une assez mauvaise heuristique que personne ne mettrait en œuvre Comme il n'est pas sûr de fil, mais c'est le concept général de la façon dont vous traiteriez les conditions de course de toute façon).

Je crois qu'il y a au moins un exemple de création d'un mutex sur le Web, mais je ne l'ai pas regardé par-dessus en détail - il a des détracteurs, mais je ne sais pas une autre façon d'atteindre la «sécurité des threads» en JavaScript. Je n'ai jamais eu besoin d'implémenter des «filetages de JS», mais je commence à chercher si je devais faire face aux conditions de course en JavaScript.

Vous ne pouvez pas faire un mutex en javascript simplement car il n'y a vraiment pas de fonction de sommeil intégrée disponible.

Voir: Existe-t-il une fonction de sommeil JavaScript ou jQuery équivalente?

De plus, il n'y a aucun moyen de s'assurer que le drapeau booléen de votre mutex n'est pas accessible en même temps qu'un autre fil, le booléen lui-même a alors besoin d'un mutex ... et ainsi de suite. Vous auriez besoin de quelque chose comme un mot-clé synchronisé en Java pour être disponible en JavaScript et cela n'existe tout simplement pas. J'ai eu des situations où je m'inquiétais de la sécurité des fils, mais quand le code de toute façon avec un plan alternatif si une erreur s'est produite, mais cela n'a pas encore eu lieu.

Donc, mon conseil, c'est que si vous obtenez une erreur, ce n'est probablement pas à cause d'une condition de course.

Que pensez-vous de l'article suivant? Je viens de le trouver dans Google

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top