6

Giả sử tôi muốn gửi một yêu cầu AJAX không đồng bộ với máy chủ, và khi nó đáp ứng gửi một yêu cầu khác và lặp lại mãi mãi:vòng lặp vô hạn với mô hình gọi lại không đồng bộ trong javascript

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

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

infinite(); 

tôi giả sử ở đây chúng tôi sẽ chạy ra khỏi ngăn xếp không gian khá nhanh chóng, vậy làm thế nào tôi có thể làm điều này (mà không bị chặn)?

Mẫu chuyển cuộc gọi lại xung quanh thay vì sử dụng return đặc biệt phổ biến với node.js. Mọi người tạo vòng lặp vô hạn như thế nào? Tôi không tin rằng hầu hết các động cơ JS làm bất kỳ loại tối ưu hóa cuộc gọi đuôi.

+2

Điều đó sẽ không chạy ra khỏi ngăn xếp không gian như khi gọi lại được gọi là khung ngăn xếp bên dưới nó không chứa ngăn xếp của cuộc gọi 'vô hạn' trước đó. –

+0

@DanD. Tôi đã thử nó trong Chrome bằng cách thêm 'callback();' trong 'sendXHR', và nó báo cáo' Maximum stack stack size vượt quá' sau khoảng 9500 lần lặp. Firefox cũng nói "quá nhiều đệ quy". – Flash

+0

Vậy thì có thể có điều gì đó thú vị trong * Gửi XMLHttpRequest tới máy chủ và gọi lại khi nhận được phản hồi * một phần. –

Trả lời

9

Nếu cuộc gọi ajax của bạn không đồng bộ, bạn không hết dung lượng ngăn xếp vì sendXHR() trả về ngay sau khi yêu cầu ajax được gửi. Gọi lại sau đó được gọi một thời gian sau đó khi đáp ứng ajax đến. Không có ngăn xếp xây dựng.


Nếu cuộc gọi ajax của bạn là đồng bộ và bạn muốn cho phép các sự kiện khác và những gì không xảy ra trong môi trường javascript, sau đó bạn có thể để một cái gì đó như thế này:

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

Ý kiến ​​của ông dường như chứng minh rằng ông thực sự chạy ra khỏi không gian ngăn xếp, do đó, có vẻ như anh ấy hát XHR đồng bộ. –

+0

@SeanKinsey - vì OP không rõ ràng về đồng bộ so với async, giờ đây tôi đã đưa ra câu trả lời cho cả hai. – jfriend00

+0

Cảm ơn, bạn tất nhiên là đúng .. không có ngăn xếp nào được xây dựng nếu nó không đồng bộ. – Flash

Các vấn đề liên quan