6

또 다른 요청을 보내 영원히 반복 응답 할 때 나는 서버에 비동기 AJAX 요청을 보내려면, 그리고 가정 해무한 루프

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

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

infinite(); 

을 나는 우리가 부족할 것이라고 가정한다 스택 공간이 꽤 빨리, 그래서 어떻게 할 수 있습니까 (차단하지 않고)?

return을 사용하는 대신 콜백을 전달하는 패턴은 특히 node.js에서 많이 사용됩니다. 사람들이 무한 루프를 만드는 방법은 무엇입니까? 나는 대부분의 JS 엔진이 꼬리 호출 최적화를 수행한다고 생각하지 않는다.

+2

이 부족하지 않을 것이라고를 스택 공간은 콜백이 호출 될 때 그 아래의 스택 프레임은 이전의'무한 (infinite) '호출 스택을 포함하지 않는다. –

+0

@DanD. 나는'sendXHR'에'callback();'을 추가하여 Chrome에서 시도해 보았고 약 9500 회 반복 후에'최대 호출 스택 크기 초과 '를보고합니다. 파이어 폭스는 또한 '너무 많은 재귀'라고 말합니다. – Flash

+0

그러면 XMLHttpRequest를 서버에 보내고 응답이 수신되면 콜백 콜을 할 수 있습니다. –

답변

9

ajax 호출이 비동기 인 경우 sendXHR()이 ajax 요청이 전송 된 직후 반환되기 때문에 스택 공간이 부족하지 않습니다. 그런 다음 콜백은 ajax 응답이 도착하면 나중에 호출됩니다. 스택 빌드가 없습니다.


아약스 호출 동기와 다른 이벤트와 무엇을 당신이 그렇게 이런 일이 수, 자바 스크립트 환경에서 발생하지 않도록 허용 할 경우

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

그의 주석은 실제로 그가 스택 공간을 다 써 버렸다는 것을 증명하는 것처럼 보입니다. 그래서 그가 동기식 XHR을 부르는 것처럼 보입니다. –

+0

@SeanKinsey - OP가 동기 대 비동기에 대해 명확하지 않았으므로 이제 두 가지 모두에 대한 답변을 포함했습니다. – jfriend00

+0

고마워요, 물론 맞습니다. 스택이 비동기 적이라면 빌드가 없습니다. – Flash