6

假設我想發送異步AJAX請求到服務器,當它響應發送另一個請求,永遠重複:無限循環在JavaScript中異步回調格局

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

這不會跑出來的堆棧空間,當回調被調用時,它下面的堆棧框架不包含前一個「無限」調用的堆棧。 –

+0

@DanD。我在Chrome中通過在'sendXHR'中添加'callback();'來嘗試它,並且它在大約9500次迭代之後報告「Maximum call stack size exceeded」。 Firefox也說'太多的遞歸'。 – Flash

+0

那麼也許有一些有趣的*發送XMLHttpRequest到服務器和調用回調時收到迴應*部分。 –

回答

9

如果您的ajax調用是異步的,那麼您不會用完堆棧空間,因爲在發送ajax請求後sendXHR()會立即返回。然後在ajax響應到達後的某個時間調用回調。沒有堆積累。


如果你的AJAX調用是同步的,並要允許其他事件,什麼不能在JavaScript環境中發生的,那麼你可以這樣像這樣:

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