Mein Hintergrund ist traditionelle kompilierte objektorientierte Sprachen wie C ++ und .NET-Programmierung, und ich arbeite jetzt an ein bisschen JavaScript für ein neues Projekt. Ich habe mich mit AJAX beschäftigt und bin auf einen verwirrenden Aspekt der Verwaltung von Objekten durch den Browser gestoßen.
[Bearbeiten # 2] - Änderung in Skripten mit aktivem Inhalt
Ich habe eine Übungsseite mit drei Buttons, die jeweils ein <textarea>
mit XMLHttpRequest
objects aktualisieren:
Where slowtime.php und fasttime.php sind einfache Skripte, die eine Text- / HTML-Seite mit zwei Zeitstempeln zurückgeben: einen, wenn die Seite nach einiger Zeit geladen wird abgelaufen.
Jede der Schaltflächen funktioniert ordnungsgemäß, wenn Sie einzeln auf sie klicken. Wenn ich auf Schaltfläche 2 und dann auf Schaltfläche 3 klicke, bevor die erste Anforderung abgeschlossen ist, funktionieren die Updates weiterhin wie erwartet.
Wenn ich auf Button 1 und dann auf Button 2 klicke, bevor die erste Anfrage abgeschlossen ist, erhalten TextArea1 und TextArea2 die korrekten Werte; die onreadystatechange
Ereignisaufrufe treten jedoch zur selben Zeit auf, d. h. die erste Antwort ist spät und wird nur verarbeitet, wenn die zweite ankommt.
Beispielcode
Website
%Vor%PHP-Code ( slowtime.php )
%Vor%Fragen [Überarbeitet]
Wie verwaltet der Browser die XMLHttpRequest
-Objekte? Durch Drücken der Tasten 2 und 3 wird angezeigt, dass bei jedem Drücken ein neues Objekt instanziiert wird und jedes dieser Objekte über unabhängige Ereignisbehandlungsroutinen verfügt. Wenn die Objekte den ersten Funktionsaufruf überleben (da ihre Event-Handler überleben), wann werden sie aus dem Speicher gelöscht / zerstört?
Wenn die XMLHttpRequests
separate Objekte sind, wie beeinflusst das Senden einer zweiten Anfrage an die gleiche URL das Antwortzeitverhalten der ersten? Könnte dies ein serverseitiges Problem sein?
context to XMLHttpRequest wird niemals gelöscht, es sei denn, delete wird explizit für das Objekt aufgerufen. In diesem Fall: xmlhttp. Sie sollten diese var irgendwie verfolgen und es aufräumen, wenn Sie möchten, dass Ihre Anwendung mager und sauber läuft. Javascript wurde ursprünglich für Webseiten entwickelt, so dass es dazu neigt, die Dinge laufen zu lassen, wenn Sie es nicht selbst verhindern.
Andernfalls ist es möglich, dass der Garbage Collector des Browsers das Objekt löscht, sobald das Objekt nicht mehr von anderen Funktionen verwendet werden kann oder noch Callbacks hat.
Was Ihr Problem mit den gleichzeitig stattfindenden Ereignissen betrifft, kann ich das Problem nicht selbst reproduzieren, was mich glauben lässt, dass Sie ein Problem mit Ihrer PHP-Konfiguration haben. Ist es möglich, dass Ihr Server nicht mehrere Skripts gleichzeitig ausführen lässt?
Hier ist Ihr Beispiel auf meinem Server, mit ein paar kleinen Änderungen: Ссылка
Dies ist ein Browserproblem.
Wenn Sie die URLs eindeutig machen, zB slowtime.php?1
und slowtime.php?2
, verhält sich Chrome nicht mehr so.
btw- in meinem Test aktualisiert Chrome beide Textfelder mit den gleichen Werten - die Werte aus der ersten Anfrage. und sie beide aktualisieren, wenn die erste Anfrage beendet ist, nicht wenn die zweite beendet ist. Das ist sicherlich ein Fehler, weil es einfach falsch ist. Ich habe über Webserver-Logs verifiziert, dass die 2. Anfrage nie gesendet wird.
Tags und Links javascript html ajax xmlhttprequest