6

Supponiamo che io voglio inviare una richiesta AJAX asincrona al server, e quando risponde inviare un'altra richiesta e ripetere sempre:ciclo infinito con il modello callback asincroni in javascript

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

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

infinite(); 

presumo qui ci sarebbe a corto di impilare lo spazio abbastanza rapidamente, quindi come posso fare questo (senza bloccare)?

Il pattern di richiamare le richiamate anziché utilizzare return è particolarmente popolare con node.js. Come fanno le persone a creare loop infiniti? Non credo che la maggior parte dei motori JS facciano alcun tipo di ottimizzazione delle chiamate tail.

+2

che non sarebbero a corto di impilare lo spazio come quando viene chiamato il callback, i frame dello stack sottostanti non contengono lo stack della precedente chiamata 'infinita'. –

+0

@DanD. L'ho provato in Chrome aggiungendo 'callback();' in 'sendXHR', e riporta 'Maximum stack stack size exceeded' dopo circa 9500 iterazioni. Firefox dice anche "troppa ricorsione". – Flash

+0

Bene, allora forse c'è qualcosa di interessante nel * Invia XMLHttpRequest al server e richiamare quando la risposta viene ricevuta * parte. –

risposta

9

Se la chiamata ajax è asincrona, non si esaurisce lo spazio di stack perché sendXHR() restituisce immediatamente dopo l'invio della richiesta Ajax. Il callback viene quindi chiamato qualche tempo dopo quando arriva la risposta ajax. Non c'è accumulo di stack.


Se la chiamata AJAX è sincrona e si desidera consentire ad altri eventi e ciò non accada nell'ambiente javascript, allora si potrebbe quindi qualcosa di simile:

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

I suoi commenti sembrano dimostrare che effettivamente ha esaurito lo stack space, quindi sembra che stia cantando XHR sincrono. –

+0

@SeanKinsey - poiché l'OP non era chiaro su synch vs. async, ora ho incluso le risposte per entrambi. – jfriend00

+0

Grazie, naturalmente hai ragione ... non c'è accumulo di stack se è asincrono. – Flash