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 के साथ विशेष रूप से लोकप्रिय है। लोग अनंत लूप कैसे बनाते हैं? मुझे विश्वास नहीं है कि अधिकांश जेएस इंजन किसी प्रकार की पूंछ कॉल अनुकूलन करते हैं।

+2

यही से बाहर चलाने के नहीं होता स्टैक स्पेस जब कॉलबैक को नीचे स्टैक फ्रेम कहा जाता है, तो इसमें पिछले 'अनंत' कॉल का ढेर नहीं होता है। –

+0

@DanD। मैंने 'sendXHR' में' कॉलबैक(); 'जोड़कर क्रोम में इसे आजमाया, और यह लगभग 9500 पुनरावृत्तियों के बाद' अधिकतम कॉल स्टैक आकार पार हो गया 'रिपोर्ट करता है। फ़ायरफ़ॉक्स भी 'बहुत अधिक रिकर्सन' कहता है। – Flash

+0

वैसे तो शायद कुछ दिलचस्प है * सर्वर पर XMLHttpRequest भेजें और प्रतिक्रिया प्राप्त होने पर कॉलबैक कॉल करें * भाग। –

उत्तर

9

यदि आपका AJAX कॉल असीमित है, तो आप स्टैक स्पेस से बाहर नहीं निकलते हैं क्योंकि sendXHR() AJAX अनुरोध भेजे जाने के तुरंत बाद लौटाता है। तब कॉलबैक को कुछ समय बाद बुलाया जाता है जब 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

उनकी टिप्पणियां साबित होती हैं कि वह वास्तव में स्टैक स्पेस से बाहर निकलता है, ऐसा लगता है कि वह सिंक्रोनस एक्सएचआर गा रहा है। –

+0

@ सेनकिंसे - चूंकि ओपी सिंच बनाम एसिंक के बारे में स्पष्ट नहीं था, इसलिए अब मैंने दोनों के लिए जवाब शामिल किए हैं। – jfriend00

+0

धन्यवाद, आप बिल्कुल सही हैं .. अगर यह असीमित है तो कोई ढेर नहीं बनता है। – Flash

संबंधित मुद्दे