6

Angenommen, ich mag einen asynchronen AJAX-Request an den Server senden, und wenn es eine weitere Anforderung senden und wiederholen Sie reagiert immer:Endlosschleife mit asynchronem Rückruf Mustern in Javascript

function sendXHR(url, callback) { 
    // Send XMLHttpRequest to server and call callback when response is received 
} 

function infinite() { 
    sendXHR('url/path', infinite); 
} 

infinite(); 

Ich nehme hier würden wir aus laufen Stapelplatz recht schnell, also wie kann ich das machen (ohne zu blockieren)?

Das Muster der Weitergabe von Rückrufen eher als return ist besonders beliebt mit node.js. Wie schaffen Menschen unendliche Schleifen? Ich glaube nicht, dass die meisten JS-Engines irgendeine Art von Tail-Call-Optimierung machen.

+2

Das wäre nicht aus laufen Stack-Space, wenn der Callback aufgerufen wird Die Stack-Frames darunter enthalten nicht den Stack des vorherigen "unendlichen" Calls. –

+0

@DanD. Ich habe es in Chrome ausprobiert, indem ich 'callback();' in 'sendXHR' hinzugefügt habe, und nach ungefähr 9500 Iterationen die maximale Call-Stack-Größe überschritten hat. Firefox sagt auch 'zu viel Rekursion'. – Flash

+0

Nun, vielleicht gibt es etwas Interessantes in der * Send XMLHttpRequest an den Server und Rückruf aufrufen, wenn die Antwort erhalten ist * Teil. –

Antwort

9

Wenn Ihr Ajax-Aufruf asynchron ist, haben Sie nicht genug Speicherplatz im Stack, da sendXHR() sofort zurückkehrt, nachdem die Ajax-Anfrage gesendet wurde. Der Callback wird dann einige Zeit später aufgerufen, wenn die Ajax-Antwort eintrifft. Es gibt keinen Stapelaufbau.


Wenn Ihr Ajax-Aufruf ist synchron und Sie möchten auf andere Ereignisse erlauben und was nicht in der Javascript-Umgebung passieren, dann könnte man so etwas wie dieses:

function sendXHR(url, callback) { 
    // Send XMLHttpRequest to server and call callback when response is received 
} 

function infinite() { 
    sendXHR('url/path'); 
    setTimeout(infinite, 1); 
} 

infinite(); 
+0

Seine Kommentare scheinen zu beweisen, dass er tatsächlich keinen Stack mehr hat, also sieht es so aus, als singe er synchron XHR. –

+0

@SeanKinsey - da das OP über Synch vs. Async nicht klar war, habe ich jetzt Antworten für beide enthalten. – jfriend00

+0

Danke, du hast natürlich recht .. es gibt keinen Stack Aufbau wenn es asynchron ist. – Flash