ExtJS 4 - Wie um zu überprüfen, ob alle aktuellen ajax-Anfragen abgeschlossen sind und dann eine Aktion ausführen?
Ich habe eine Seite, die feuert Ajax-Anforderungen für Validierungen auf server-Seite. Ich muss eine Aktion ausführen, wenn alle ajax-requests fertig geladen ist oder abgeschlossen sind.
Für diese, ich bin mit Ext.Ajax.isLoading() in eine rekursive Funktion in folgender Weise:
function chechValid(){
if(Ext.Ajax.isLoading()){
checkValid();
}else{
//Code for Action 1
}
}//EOF
checkValid();
//Code for Action 2
Das problem ist, dass wenn ich dies mache, Browser, geben Sie die folgenden Fehler:
Mozill FF - zu viel rekursionen
IE - Stack overflow at line:18134
Wenn diese Rekursion ist eine schwere Sache für den Browser, dann, wie eine Aufgabe zu erledigen, wenn alle Ajax-requests fertig geladen ist?
Delay ist nicht das, was ich will, als wenn delay verwendet wird, dann wird der browser mit der Ausführung beginnt, den anderen code (wie 'Code für Aktion 2" als shared oben) das ist nicht das, was erwartet wird.
Das wichtigste Ziel ist, dass der browser sollte nicht ausgeführt werden, außer wenn alle Ajax-Anfragen, die sind komplett und einmal abgeschlossen, dann sollte die Durchführung einer bestimmten Aktion.
Anregungen/Hilfe dazu?
Vielen Dank im Voraus.
PS: Mit ExtJs 4.0.7
(Aktualisiert)Mehr Details über die aktuelle situation:-
Hier ist die kurze Beschreibung der situtaion zu kämpfen hat - Es ist eine form, in die ich ausführen muss, um server-side Validierungen auf verschiedenen Feldern. Ich bin dabei und feuerte einen ajax-request auf blur-event. Abhängig von der server-Antwort der Validierung Ajax feuerte auf Unschärfe, Felder werden als ungültig gekennzeichnet und die form der Einreichung ist nicht zulässig. (Vermeidung von 'change' - Ereignis als, die bewirkt, dass eine Menge overhead auf dem server aufgrund der hohen Anzahl von Ajas Anfragen und führt auch zu Schwankungen in der Wirkung auf ein Feld bei der Reaktion von verschiedenen solchen Ajax-Anfragen eingegangen sind).
Alles funktioniert einwandfrei außer in einem Fall - wenn der Benutzer ändert den Wert eines Feldes und anstelle von " tab'bing aus dem Feld Sie direkt Klicks auf die Schaltfläche speichern. In einem solchen Fall, wenn das blur-Ereignis gefeuert wird, aber die Bearbeitung 'Speichern' nicht warten, für die Ajax-Validation-response und übermittelt das Formular. Dadurch, dass ich irgendwie brauchen, um zu überprüfen, ob Ajax-requests finihed laden und der Prozess der Speicherung der form. requestComplete würde leider nicht dienen, hier. Und wenn Sie versuchen, mithilfe der Rekursion, und dann natürlich der browser abgestürzt ist wegen zu hohe Auslastung der Ressourcen. Der gleiche Fall tritt auf, wenn ich versuche, mit einer pause Skript umgehen ( als shared - Javascript Schlafen).
Mögliche Abhilfe für dieses?
TIA
- Fügen Sie bitte einen Kommentar, wenn die Abstimmung nach unten. Das würde helfen, zu verbessern, was fehlt in der Frage. Danke.
- Nach der Bewertung der Dinge, ich gefunden, dass dies die gleiche alte Forderung zu erwarten, ein Schlaf-Funktion in Javascript 🙂 Wie hier diskutiert - stackoverflow.com/questions/5832276/... - und an vielen anderen Orten. Ich Frage mich, dass, obwohl JS ist ein single-threaded-Sprache, aber angesichts der Präsenz von Ajax sollte es nicht so eine Funktionalität zum anhalten der Dinge in JS, wenn erforderlich? Schreiben von code in der Anfrage komplette Ereignis kann nicht immer dem Zweck dienen, zu teilen, wie in der situation vor.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre Methode führt zu einer unendlichen Rekursion.
Bessere Weg ist, sich zu registrieren einer callback-Funktion in
Ext.Ajax.requestcomplete
, so etwas (nicht getestet):};
Es sei denn, ich bin Missverständnis, das Problem konnten Sie nicht schaffen ein paar globals. Ich weiß globals sind schlecht, aber in diesem Fall wird Sie ganz sparen ein bisschen Kopfschmerzen. Ein globales wäre "formReady" und zunächst auf false gesetzt, die andere wäre "ajaxActive" und auf false gesetzt. Sie würde auch hinzufügen, ein onSubmit-Methode, die würde bestätigen, dass "formReady" wurde wahr, und wenn nicht der Benutzer gewarnt wird, dass eine überprüfung ausgeführt wurde (alternativ können Sie einen timeout für das senden des Formulars wieder und haben eine zweite überprüfung, die prüft, um zu sehen, ob "ajaxActive" ist true). Wenn der AJAX-Aufruf gemacht, es würde die variable "ajaxActive" auf true und einmal komplett einstellen würde formReady zu wahren. Sie könnten auch potenziell erneut die form automatisch, wenn die Antwort des AJAX-war, dass die form gut war.
Ext.Ajax.Anfrage() gibt ein transaction-Objekt, wenn Sie es nennen, das ist einzigartig und ermöglicht es Ihnen, zu erkennen und Abbruch bestimmte Ajax-Anfragen.
Nur durch Aufruf von Ext.Ajax.isLoading() ohne eine bestimmte Transaktion-Objekt, es wird standardmäßig auf die Letzte Anfrage, das ist, warum Sie nennen es rekursiv im moment.
Wenn es nach mir ginge, würde ich ein array erstellen, der diese Transaktion Objekte, wie Sie Feuer Sie ab, und übergeben jedes von diesen als optionale Parameter die Ext.Ajax.isLoading () - Funktion, um zu überprüfen, ob eine bestimmte Anforderung beendet hat. Wenn es hat, können Sie das transaction-Objekt aus dem array, und nur die Fortschritte mit dem speichern, wenn das array leer ist.
Dies würde zu erhalten, Runde Ihrer Rekursion problem, da hast du immer eine endliche Anzahl von Anfragen, die Sie warten, auf.