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:
-
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 :)
-
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.
-
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?
-
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.
- Initialisierung der Objekte Bereichstabelle und Bereichsdatenquelle. Zuordnung von Bereichstabellenobjekten zu bestimmten Ereignissen.
- AJAX-Aufruf, um alle Bereiche für jede Kategorie zu erhalten. Wir warten darauf, bevor wir fortfahren.
- Initialisieren Sie die Benutzertabelle ähnlich wie die Bereichstabelle.
- 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]
- 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)
- AJAX-Aufruf, um alle Benutzer für firstName['A'] zu erhalten. Entfernen Sie den Bereich firstNames['A'] aus der Ladewarteschlange.
- Befüllen Sie die entsprechenden UI-Elemente
- 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.