2010-07-22 12 views
6

क्या सभी उत्कृष्ट jQuery AJAX अनुरोधों को त्यागने का कोई आसान तरीका है? मेरा आवेदन बहुत से अनुरोधों को खींचने में सक्षम है, इसलिए दौड़ समस्याग्रस्त हो जाती है। मैंने हैकिश समाधान (अर्थात्, अनुरोध को पूरा करने पर चेक किए गए ध्वज में डाल दिया है), लेकिन वैश्विक बकाया अनुरोधों को पूरा करने के लिए यह बहुत अच्छा होगा।jQuery सभी बकाया AJAX अनुरोधों को छोड़ दें

उत्तर

11

असाइन एक सरणी के एक तत्व के रूप में हर ajax अनुरोध:

var requests = []; 

requests.push($.ajax({ 
    type: 'POST', 
    url: '...', 
    success: successfunc 
    }); 
); 

और मारने के लिए:

$.each(requests, function(i, v) { 
    v.abort(); 
}); 
+0

धन्यवाद। ऐसा लगता है कि चाल चल रही है। मैंने थोड़ा अलग कार्यान्वयन चुना है जो मैं विस्तार से [यहां] (http://stackoverflow.com/questions/3313059/jquery-abandon-all-outstanding-ajax-requests/3313954#3313954) –

1

मैं कहूंगा कि सभी एजेक्स अनुरोधों को एक सरणी में स्टोर करें। जब आपको मारने की आवश्यकता होती है तो सरणी में सभी मानों के माध्यम से बस लूप करें और abort() को कॉल करें। जब कोई अनुरोध पूरा हो जाता है या सरणी से पॉप को निरस्त कर दिया जाता है।

2

XMLHttpRequest में एक abort() फ़ंक्शन है। $ .ajax आपको xhr ऑब्जेक्ट पर अपना हाथ लेने देता है। सभी बकाया xhr के रिकॉर्ड रखें और xhr.abort() पर जाएं जिसे आप समाप्त करना चाहते हैं।

3

दूसरों के रूप में कहा है, .abort() विधि का उपयोग करें। हालांकि, यह केवल उसी डोमेन के भीतर कॉल पर काम करता है। एक बार जब आप क्रॉस-साइट कॉल (jsonp के साथ) में प्रवेश करते हैं, तो .abort() विधि को शून्य पर सौंप दिया जाता है, इसलिए वास्तव में आग/काम नहीं होता है।

इस रूप में ध्यान देने योग्य मुझे अंतहीन डिबगिंग समय कई एक छोटे से चंद्रमा पहले की वजह से :)

जिम

+0

कूल जानकारी, उस सिर के लिए धन्यवाद । – Anders

+0

एंडर्स - खुशी ... (आईई पर नवीनतम स्थिति की जांच करें क्योंकि यह मुख्य रूप से आईईएम में XMLHttpRequest था जो मेरे मामले में ब्राउज़र अज्ञेयवादी बनाने की कोशिश करते समय एक मुद्दा था)। मुझे याद है कि निरस्त 'टाइमआउट' एक्स-साइट कॉल पर 0 पर सेट है। वैसे भी .. :) –

3

केन Redler के समाधान के आधार पर, मैं अपने प्रारंभ में रखते:

window.requests = [] 
$.ajaxSetup({ 
    beforeSend: function(xhr){ 
    var new_request_list = [xhr] 
    $.each(window.requests, function(k,v){ 
     if(v.readyState != 4) new_request_list.push(v) 
    }) 
    window.requests = new_request_list 
    } 
}) 

मैं वैश्विक चर को पूर्ण XHR ऑब्जेक्ट्स के साथ भीड़ प्राप्त करने से रोकने के लिए new_request_list के साथ स्निपेट में डालें।

+0

मैं क्लीनअप फ़ंक्शन को '$ .ajaxSetup' या' xhr.onreadystatechange' में डाल दूंगा, लेकिन मुझे चिंता है कि यह जो कुछ भी jQuery करता है उसके साथ हस्तक्षेप करेगा। यह समाधान ठीक काम करता प्रतीत होता है। –

1

मुझे निम्नलिखित jsfiddle पर मिला। यह अधिकतर ऊपर जैसा ही है, सिवाय इसके कि यह पूरा होने के बाद प्रत्येक अनुरोध को हटा देगा। ऊपर दिए गए समाधान केवल सरणी में जोड़ते रहते हैं। तो समय के साथ, अगर आप बहुत सारे AJAX कॉल कर रहे हैं तो यह बड़ा हो सकता है। जब आप सभी बकाया अनुरोधों को निरस्त करना चाहते हैं तो आप $.xhrPool.abortAll(); पर कॉल करते हैं।

// $.xhrPool and $.ajaxSetup are the solution 
$.xhrPool = []; 
$.xhrPool.abortAll = function() { 
    $(this).each(function(idx, jqXHR) { 
     jqXHR.abort(); 
    }); 
    $.xhrPool = []; 
}; 

$.ajaxSetup({ 
    beforeSend: function(jqXHR) { 
     $.xhrPool.push(jqXHR); 
    }, 
    complete: function(jqXHR) { 
     var index = $.xhrPool.indexOf(jqXHR); 
     if (index > -1) { 
      $.xhrPool.splice(index, 1); 
     } 
    } 
}); 
संबंधित मुद्दे