6

Załóżmy, że chcemy wysłać asynchronicznego AJAX żądanie do serwera, a gdy reaguje wysłać kolejną prośbę i powtarzać zawsze:Nieskończona pętla z asynchronicznym wzór zwrotnego w javascript

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

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

infinite(); 

Zakładam tutaj, że zabraknie szybko ułożyć przestrzeń, więc jak mogę to zrobić (bez blokowania)?

Wzorzec przekazywania zwrotnego zamiast używania return jest szczególnie popularny w przypadku node.js. Jak ludzie tworzą nieskończone pętle? Nie wierzę, że większość silników JS wykonuje jakąkolwiek optymalizację połączeń.

+2

Że nie zabraknie przestrzeń stosu, jak wtedy, gdy wywołanie zwrotne jest nazywane ramkami stosu poniżej, nie zawiera stosu poprzedniego połączenia 'nieskończonego '. –

+0

@DanD. Próbowałem go w Chrome, dodając 'callback();' w 'sendXHR', i zgłasza komunikat' Maksymalny rozmiar stosu połączeń przekroczony' po około 9500 iteracjach. Firefox również mówi "zbyt wiele rekursji". – Flash

+0

Cóż, być może jest coś ciekawego w * Wyślij XMLHttpRequest do serwera i zadzwoń do callback po otrzymaniu odpowiedzi * część. –

Odpowiedz

9

Jeśli twoje wywołanie ajax jest asynchroniczne, nie zabraknie ci miejsca na stosie ponieważ sendXHR() powraca natychmiast po wysłaniu zapytania ajax. Callback jest następnie wywoływany jakiś czas później, gdy nadchodzi odpowiedź ajax. Nie ma żadnych akumulacji stosu.


Jeśli wywołanie ajax jest synchroniczna i chcesz zezwolić na inne wydarzenia, a co nie wydarzy się w środowisku JavaScript, a następnie można więc coś takiego:

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

Jego komentarze wydają się udowadniać, że rzeczywiście brakuje miejsca na stosie, więc wygląda na to, że śpiewa synchroniczne XHR. –

+0

@SeanKinsey - ponieważ OP nie był jasny o zsynchronizowaniu z asynchronicznym, teraz dodałem odpowiedzi dla obu. – jfriend00

+0

Dzięki, masz oczywiście rację. Nie ma żadnych akumulacji stosu, jeśli jest to asynchroniczne. – Flash

Powiązane problemy