5 Stimmen

Hat ein Javascript-Prozess mehrere Threads der Ausführung?

Hintergrund

Ich erstelle eine Anwendung vom Typ 'Adressbuch'. Es gibt eine Menge Einträge zu laden. Eine Idee war, zunächst eine kleine Teilmenge der Einträge zu laden, um dem Benutzer den Einstieg zu erleichtern, und dann die restlichen Einträge in eine Warteschlange zu stellen, wobei die Einträge, auf die der Benutzer klickt, Vorrang haben. (z. B. wenn der Benutzer auf die Namen klickt, die mit X beginnen, werden diese zuerst geladen, bevor der Rest der Warteschlange abgearbeitet wird). Die Idee ist, einen ersten Datensatz bei der Initialisierung zu laden (über AJAX) und dann den Rest im Hintergrund zu laden (was eine Menge AJAX-Aufrufe erfordert).

Meine vielen Fragen

Konzeptionell weiß ich, wie man das macht, aber ich bin mir nicht im Klaren über die Grenzen der Javascript-Engine:

  1. Ist die Reihenfolge der Ausführung browserabhängig? Ich habe unter anderem versucht, die Einträge (A, B, C usw.) in eine Warteschlange zu stellen und dann eine ganze Reihe von Anfragen auf einmal zu stellen. Das war nicht sehr erfolgreich. Ich bekam zwar die meisten Anrufe zurück, aber nicht in einer bestimmten Reihenfolge. Ich brauche alle meine Anrufe zurück :)

  2. Wie kann ich das Problem beheben/verfolgen? Ich bin nicht sicher, wie Javascript die Antwort behandelt; es war einfach genug für eine einzelne Antwort, aber ich bin nicht sicher, wie man mehrere, relativ große Antworten vom Server zu behandeln.

  3. Gibt es einen einzigen Ausführungsstrang für eine bestimmte Seite? Das heißt, wenn das Javascript eine Antwort vom Server erhält, aber noch Code ausführt, wird die Transaktion blockiert, bis der aktuell ausgeführte Code beendet ist?

  4. Wäre es empfehlenswert, eine Verzögerung zwischen den Anfragen einzufügen? Dies könnte auch Probleme verursachen, weil das Laden und Senden der Anforderung (ab jetzt) in der Initialisierungsphase ist; wenn ich zwischen den Anforderungen zu schlafen(), dann könnte ich auch nur zwingen, den Benutzer zu warten, bis die alle Daten zu laden, ohne zu versuchen, diese schrittweise Laden zu tun.

Ich habe mich auf SO umgesehen, aber ich habe nichts Nützliches gefunden. Ich bin neugierig, wie JS diese asynchronen Anfragen/Antworten verarbeiten.

Was ich bis jetzt getan habe

Damit sich die Leute ein besseres Bild davon machen können, was ich tue, hier die Reihenfolge der Ausführung. Es gibt 5 fest programmierte Suchkategorien: Vornamen, Nachnamen, Klassen, Regionen, Staaten. Jede dieser Kategorien hat Bereiche. Die Kategorie "Vornamen" könnte zum Beispiel 26 Bereiche haben, einen für jeden Buchstaben des Alphabets: "Aardvark - Azariah" wäre ein Beispiel für einen Bereich. Jeder Bereich enthält die Benutzerinformationen für jeden Benutzer in diesem Bereich. Ich habe zwei Tabellen: eine Bereichstabelle und eine Benutzertabelle.

  1. Initialisierung der Objekte Bereichstabelle und Bereichsdatenquelle. Zuordnung von Bereichstabellenobjekten zu bestimmten Ereignissen.
  2. AJAX-Aufruf, um alle Bereiche für jede Kategorie zu erhalten. Wir warten darauf, bevor wir fortfahren.
  3. Initialisieren Sie die Benutzertabelle ähnlich wie die Bereichstabelle.
  4. Erstellen Sie eine Ladewarteschlange, um alle Benutzer für jeden Bereich zu erhalten. Die Ladewarteschlange sieht wie folgt aus: [ lastNames['S'], states['CA'], regions['northwest'], lastNames['A'], etc]
  5. Wählen Sie die Kategorie "Vornamen", den Bereich "A" Vornamen und den nullten Benutzer in diesem Bereich aus. (Dies ist nur eine willkürliche Auswahl, die ich getroffen habe, um dem Benutzer einen Ausgangspunkt zu geben)
  6. AJAX-Aufruf, um alle Benutzer für firstName['A'] zu erhalten. Entfernen Sie den Bereich firstNames['A'] aus der Ladewarteschlange.
  7. Befüllen Sie die entsprechenden UI-Elemente
  8. Schleife durch unsere Ladewarteschlange, Entnahme von Bereichen aus der Warteschlange und Erstellung von AJAX-Anfragen für die Daten.

Es gibt noch viele andere Details... aber das ist das Wesentliche.

Was passiert, ist, dass meine Bereichstabelle füllt sich gut... aber dann der Browser einfach blockiert (spod) und dann meine Benutzer-Tabelle bekommt alle Arten von verrückten Daten, die in es aufgefüllt. Offensichtlich ist die letztere ein UI-Bug auf meinem Teil, so dass ich zu untersuchen, dass, aber es ist nicht klar für mich, dass dies der beste Weg, dies zu tun ist.

Bei Schritt 7 bin ich mir nicht sicher, ob es eine Verzögerung zwischen den Anfragen geben sollte. Im Idealfall, wenn ein Benutzer einen bestimmten Bereich ausgewählt hat, sagen wir states['AK'], würden wir diese Anforderung zuerst verarbeiten und diesen Bereich aus unserer Warteschlange löschen. Wenn ich aber alle Anfragen an das Frontend sende, haben wir nie die Möglichkeit, unserem gewählten Bereich die entsprechende Priorität zu geben.

8voto

SLaks Punkte 832502

Javascript ist komplett single-threaded.

Wenn Sie mehrere AJAX-Aufrufe tätigen, erhalten Sie jede Antwort, sobald der Server sie sendet; die Reihenfolge hängt von der Zeit ab, die der Server zum Senden jeder Antwort benötigt.

Wenn Ihr Code noch läuft, wenn der Server antwortet, wird die Antwort erst nach Beendigung Ihres Codes verarbeitet.

Sie sollten versuchen, alle Daten in einer einzigen Anfrage zu laden.

1voto

duffymo Punkte 298898

Ist Reihenfolge der Ausführung abhängig? Eines der Dinge, die ich versucht habe zu tun, war das Aneinanderreihen der Einträge (A's, B's, C's, etc) und dann ein ganzes Bündel von Anfragen alle auf einmal. Das war nicht sehr erfolgreich. Ich bekam die meisten Anrufe zurück, aber nicht in einer bestimmten Reihenfolge. Ich brauche alle meine Anrufe zurück.

Die Reihenfolge der Ausführung ist nicht browserabhängig. Sie sind ereignisgesteuert, und die Ereignisse sind Ihnen überlassen. Wenn Sie "Warteschlange" sagen, ist keine Nachrichtenwarteschlange im Spiel; Sie meinen den Mechanismus, den der Server hat, um die Nachrichten aufzunehmen und sie Threads zuzuweisen.

Die Rücklaufzeit der Anrufe richtet sich nach der Zeit, die für ihre Bearbeitung benötigt wird. Zwischen Ihrem Browser und dem Server befindet sich ein nicht-deterministisches Netzwerk, so dass Sie das nicht erkennen können.

Wie kann ich das Problem beheben/verfolgen? Ich bin nicht sicher, wie Javascript mit der Antwort verarbeitet; es war einfach genug für eine sin wie man mit mehreren, relativ großen großen Antworten des Servers umgehen soll.

Google Chrome verfügt über einige sehr gute Debugging-Tools, die von Apple gestiftet und als Open Source zur Verfügung gestellt wurden. Probieren Sie diese aus. Oder Sie können Firefox Firebug ausprobieren.

Gibt es einen einzigen Dreier für eine bestimmte Seite? Das heißt, wenn das Javascript eine Antwort von der Server erhält, aber noch Code ausführt, wird die Transaktion blockiert, bis der bis der aktuell ausgeführte Code beendet ist?

JavaScript ist single threaded.

Wäre es empfehlenswert Verzögerung zwischen den Anfragen? Dies könnte auch Probleme verursachen, da das Laden und Senden der Anfrage (ab jetzt) in der Initialisierungsphase ist Phase ist; wenn ich sleep() zwischen Anfragen schlafen muss, dann könnte ich genauso gut einfach den Benutzer dazu zwingen, auf alle Anfragen zu warten. Daten zu laden, ohne dies zu versuchen schrittweises Laden.

Ich würde keine Verzögerung zwischen den Anfragen einbauen. Ich denke, das verfehlt den Zweck.

Ich würde empfehlen, sich jQuery anzuschauen, um dabei zu helfen.

1voto

marekventur Punkte 1805

Ajax steht für "Asynchronous JavaScript and XML". "Asynchron" bedeutet, dass es keine Möglichkeit gibt, zum Zeitpunkt der Anfrage zu wissen, in welcher Reihenfolge die Antworten eintreffen werden.

JavaScript hat (im Moment) keinen Mechanismus für Threading, so dass Sie zwei Möglichkeiten haben:

  1. Fordern Sie den nächsten Teil an, nachdem der letzte eingetroffen ist. Dies kann sehr langsam und ineffizient sein, da eine hängende Anfrage alle anderen blockiert.
  2. Erstellen Sie eine Liste/Aufstellung für alle möglichen Anfragen und beginnen Sie mit dem Laden der wichtigsten. Wenn der Benutzer etwas anderes möchte, laden Sie auch den Rest. Speichern Sie die Antworten an der richtigen Stelle in Ihrem Array. Dadurch wird Ihr Skript unabhängig von der Reihenfolge und Sie können überprüfen, ob alles vorhanden ist, indem Sie einfach eine Schleife durch Ihr Array ziehen.

0voto

Ivan Torres Punkte 1501

JavaScript ist eine ereignisgesteuerte Programmiersprache, weshalb Sie dieses Muster häufig sehen werden:

someFunction(arguments, callbackFunction () {
  // code fired after a process or event is fired
});

Wenn Sie nicht alle Antworten auf Ihre Anfragen erhalten, stimmt etwas mit Ihrer Implementierung oder der Ressource, die Sie abfragen, nicht. Sie können Firebug verwenden, um ein besseres Verständnis der Vorgänge zu erhalten.

Sind Sie mit einem JavaScript-Framework, sie machen die Verwendung von XHR-Anfragen (a.k.a. Ajax) ziemlich einfach. Ich empfehle jQuery.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X