While-Schleife mit async jQuery AJAX-Aufrufe
Der Sache:
Ich habe eine Seite, die zur Anzeige unbestimmten Anzahl von Bildern, die durch AJAX geladen (mithilfe der base64-Codierung, die auf der server-Seite) eins nach dem anderen.
var position = 'front';
while(GLOB_PROCEED_FETCH)
{
getImageRequest(position);
}
function getImageRequest(position)
{
GLOB_IMG_CURR++;
$.ajax({
url: urlAJAX + 'scan=' + position,
method: 'GET',
async: false,
success: function(data) {
if ((data.status == 'empty') || (GLOB_IMG_CURR > GLOB_IMG_MAX))
{
GLOB_PROCEED_FETCH = false;
return true;
}
else if (data.status == 'success')
{
renderImageData(data);
}
}
});
}
Das problem ist, dass die Bilder (konstruiert mit der renderImageData () - Funktion) sind beigefügt (alle zusammen) zu den bestimmten DIV nur, wenn alle Bilder heruntergeladen werden sollen. Ich meine, es gibt keine jede DOM-manipulation möglich, bis die Schleife vorbei ist.
Muss ich laden und anzeigen Bilder eins nach dem anderen aufgrund der möglichen großen Anzahl von Bildern, so kann ich nicht stapeln Sie Sie, bis Sie alle geholt werden.
- Sie starten eine Anfrage in der while-Schleife und dieser Wunsch beginnt eine weitere Anforderung, wenn
data.status == 'success'
ist und insbesondere kein Antrag, wenn Sie die EinstellungGLOB_PROCEED_FETCH = false
was die Bedingung der while-Schleife. Also, was ist der Grund für die while-Schleife überhaupt? - Behoben, dass der ursprüngliche code
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre beste Wette wäre, um die Umstrukturierung der Programmcode für die Verwendung der asynchronen ajax-Aufrufe und starten Sie den nächsten Anruf, wenn die erste abgeschlossen ist und so weiter. Damit wird die Seite wieder zwischen Bild holt.
Damit bekommt auch der browser eine chance zu atmen und achten Sie auf die anderen Zimmerreinigung und nicht denken, dass es vielleicht eingesperrt oder aufgehängt.
Und verwenden Sie
async: 'false'
ist eine schlechte Idee. Ich sehe keinen Grund, warum Sie richtig strukturiert code nicht nutzen konnten, asynchrone ajax-Aufrufe hier und hängen Sie den browser, während Sie das abrufen dieser Daten.Könnte man es machen, mit asynchronen ajax so:
Auch, während wie diese Aussehen kann Rekursion, es ist nicht wirklich die Rekursion wegen der asynchronen Natur von den ajax-call.
getNextImage()
tatsächlich abgeschlossen hat, bevor die nächste aufgerufen wird, so dass es nicht technisch Rekursion.async: true
.getNextImage()
schafft ein Ausführungskontext, der für diese Funktion. Dass Ausführungskontext bleiben im Speicher, solange alles läuft, das erreichen des ausführungskontexts. Das heißt, es bleiben im Speicher, bis diesuccess
handler wird ausgeführt, auf die insbesondere ajax-Aufruf gestartet wurde innerhalb dieses Kontextes Ausführung. Aber, sobald die ajax-Aufruf beendet ist, gibt es nichts Links, Verweise zu, dass die Ausführung Kontext, so wird es für die garbage collection freigegeben und damit ist nicht Leck.getNextImage()
läuft, startet die ajax-Aufrufs, und beendet die Ausführung aller in einem schnellen moment. Die ajax -success
- handler aufgerufen wird einige Zeit SPÄTER nach, dass der Aufruf vongetNextImage()
bereits abgeschlossen hat. Also, wenn der nächste Aufruf vongetNextImage()
wird aufgerufen, aus demsuccess
handler, es wird kein stack-frame-build-up als der Stapel bereits unwound aus dem vorherigen Aufruf zumgetNextImage()
schlichten Ausführung - diese ist nicht wirklich klassische Rekursion. Es ist also kein Speicherverlust oder bauen Sie sich mit diesem Konstrukt.getNextImage()
läuft sofort nach Rückruf bei dem Punkt, dass die Referenz nicht mehr benötigt, so gibt es keine Rekursion stapeln sich hierFalsch und falsch. Nicht user-Timern, nicht mit Verkettung. Blick auf jQuery Deferred /Wann, es hat alles, was Sie brauchen.
Versuchen Sie es mit
setInterval()
Funktion stattwhile()
.