2009-08-13 4 views
1

Ich verstehe, dass es keine Multithreading-Unterstützung in Javascript ist. Und ich wollte einige fachliche Beratung über die unten Szenario ..Multithreading und Abonnieren/Publizieren Ansatz in Javascript

Meine Forderung ist ein AJAX-Aufruf und bei erfolgreicher complete auszuführen, möchte ich von Ereignissen auslösen gesetzt (die verschiedenen Teile des UI parallel zu aktualisieren)

  • Ich plane, das Subscribe/Publish-Muster zu verwenden, ist es möglich, mehrere Listener für das AJAX-Abschluss-Event zu abonnieren.
  • Wenn möglich, ich wollte wissen, wie diese Listener auf veröffentlichen bekannt gegeben .. (parallel in Mutthithreaded oder eins nach dem anderen).

    Und schlagen Sie mir den besten Weg, um diese zu erreichen .. Ich schätze Ihre Gedanken wirklich.

EDIT ::

Ich weiß, es sind beliebte Frameworks wie JQuery dieses Muster unterstützt. Aber ich bin in der Lage, diese Funktionalität von Grund auf zu entwickeln (wir haben unser eigenes Framework).

+0

was Ajax-Framework verwenden Sie? –

+0

nicht wirklich mit irgendwelchen Frameworks .. muss dies in Core-js-Framework implementieren .. siehe meine Bearbeitungen über – RameshVel

Antwort

3

Ich habe einen Request Pooler, der Ihnen hier einen guten Start geben könnte. [Da diese Antwort angenommen wurde, habe ich den Pooler zugunsten eines vollständigeren "AJAX Helper" zurückgezogen - der Link wurde aktualisiert.]

Ich bin mir nicht sicher, ob ich alles tun werde (obwohl es sich anhört mag es nah sein). Es ist alt, aber es funktioniert:

Depressed Press DP_AJAX

es mehrere gleichzeitige Anfragen mit Timeout/Retry, pro-Request-Handler unterstützt, einen sehr geringen Platzbedarf und kann leicht mit anderen Code kombiniert werden.

Sie erstellen einen Pool (indem Sie ihm mitteilen, wie viele gleichzeitige Anfragen zulässig sind) und dann Anfragen an ihn senden. Wenn sie fertig sind, rufen sie den von Ihnen angegebenen Handler auf.

Ein kleines, vollständiges Beispiel für seinen Einsatz:

 // The handler function 
function AddUp(Num1, Num2, Num3) { 
    alert(Num1 + Num2 + Num3); 
}; 

    // Instantiate the Pool 
myRequestPool = new DP_RequestPool(4); 

    // Start the Interval 
myRequestPool.startInterval(100); 

    // Create the Request 
myRequest = new DP_Request(
    "GET", 
    "http://www.mysite.com/Add.htm", 
    {"FirstNum" : 5, "SecondNum" : 10}, 
    AddUp, 
    [7,13]); 

    // Add the request to the queue 
myRequestPool.addRequest(myRequest); 

Es ist Open Source - fühlen Sie sich frei zu hacken/fold/Spindel oder verstümmeln sie nach Herzenslust.

Jim Davis

+0

danke für die gemeinsame Jim, Es ist interessant ,, Es scheint, der DP_requestpool wird mehrere AJAX-Wiederholungen gleichzeitig behandeln ... Aber in meinem Kontext wollte ich mehrere Ereignisse parallel zur Fertigstellung der einzelnen AJAX-Antwort ... – RameshVel

+0

Eigentlich das gleiche Framework, das Sie mehrere AJAX starten können Anfragen gleichzeitig sollten einfach für die Einführung mehrerer ziemlich alles gleichzeitig übernommen werden. Sie ändern das Objekt von einem bestimmten Anfrage-Pool zu einem allgemeineren "Anweisungspool" ziemlich leicht, denke ich. –

0

Dies ist möglich und Sie sollten wirklich eine Bibliothek dafür verwenden, um alle Browser-Inkompatibilitäten zu vermeiden. Zum Beispiel bietet jQuery Ajax-Funktionalität, mit der Sie Code nach Abschluss des Ajax-Aufrufs ausführen können. Informationen zur Dokumentation finden Sie unter here.

+0

nicht wirklich mit Frameworks .. muss dies in Core-js-Framework implementieren .. siehe meine Bearbeitungen oben .. und das wird IE nur App sein .. – RameshVel

+0

Ich würde immer noch ein Framework verwenden. Es ist so viel einfacher so. – ujh

3

This article beschreibt, was Sie versuchen, ziemlich genau zu erreichen. Im Wesentlichen haben Sie nur eine JavaScript-Datei, die ein Array von Handlern/Abonnenten enthält. Jeder Teilnehmer registriert sich beim Herausgeber (d. H. Er wird dem Handler-Array hinzugefügt). Dann in der onClose Handler Ihrer Ajax-Aufruf, dann würden Sie eine Funktion aufrufen, die iteriert über die Teilnehmer und jedem von ihnen mit Namen meldet:

this.handlers = []; 
... 
for(var i = 0; i < this.handlers.length; i++) 
    { 
    this.handlers[i].eventHandler.call(this, eventArgs); 
} 
... 
+0

danke für die Antwort Yalestar .. es scheint, das gegebene Skript ruft die Hörer in einer sequence Art und Weise (eins nach dem anderen) .. gibt es eine Möglichkeit, dies parallel zu simulieren ... – RameshVel

0

, wenn Sie Funktionen in parralell Verwendung abzufeuern wollen folgende:

this.handlers = []; 
... 
for(var i = 0; i < this.handlers.length; i++) 
    { 
    setTimeout(function(){this.handlers[i].eventHandler.call(this, eventArgs);},0); 
} 
... 
2

Könnte dies als ligthweight Nachricht dienen Rahmen vorbei?

function MyConstructor() { 
    this.MessageQueues = {}; 

    this.PostMessage = function (Subject) { 
     var Queue = this.MessageQueues[Subject]; 
     if (Queue) return function() { 
             var i = Queue.length - 1; 
             do Queue[i](); 
             while (i--); 
            } 
     } 

    this.Listen = function (Subject, Listener) { 
     var Queue = this.MessageQueues[Subject] || []; 
     (this.MessageQueues[Subject] = Queue).push(Listener); 
    } 
} 

dann könnten Sie tun:

var myInstance = new MyConstructor(); 
myInstance.Listen("some message", callback()); 
myInstance.Listen("some other message", anotherCallback()); 
myInstance.Listen("some message", yesAnotherCallback()); 

und später:

myInstance.PostMessage("some message"); 

würde versenden die Warteschlangen

+0

Danke Juaco, das ist ein schönes Beispiel .... – RameshVel