2010-07-22 19 views
26

पर भेजने से पहले: Abort Ajax requests using jQuery ... inventory_search() में - AJAX अनुरोध करने से पहले, मैं कोई नया अनुरोध करने से पहले किसी मौजूदा अनुरोध की जांच कैसे कर सकता हूं और उन्हें निरस्त कर सकता हूं? या ... क्या ऐसा करने का कोई बेहतर तरीका है?jquery abort() AJAX अनुरोध

<script type="text/javascript"> 

    $(function() { 
     $('form#internal_catalog').change(function() { 
      inventory_search(); 
     }); 
    }); 

    function inventory_search() { 
     var search_data = $('form#internal_catalog').serialize(); 
     var a = $.ajax({ 
      type: 'post', 
      url: '/test.php', 
      data: search_data, 
      success: function(data) { 
       $('#catalog').html(data); 
      } 
     }); 
    } 

</script> 

उत्तर

61

अपने सभी अनुरोधों की एक सरणी कतार बनाएं। फिर यदि आपको कोई ऐसा बिंदु मिलता है जहां आपको सभी मौजूदा अनुरोधों को निरस्त करने की आवश्यकता है तो आप सरणी के माध्यम से लूप कर सकते हैं और सभी लंबित अनुरोधों पर निरस्त कॉल कर सकते हैं। बहुत सरल होना चाहिए।

हालांकि दूसरा तरीका केवल एक आंतरिक ध्वज रखना है जो इंगित करता है कि अनुरोध वर्तमान में प्रक्रिया में है या नहीं, यदि अनुरोध है तो अनुरोध छोड़ दें। या आप फिट कैसे देखते हैं संभाल लें।

संपादित करें: How to avoid 3 ajax calls?

संपादित करें 2:: यह बहुत इसी तरह की स्थिति के लिए प्रश्न की जाँच करें तो मैं आप क्या कर सकते एक सरणी है कि आप संलग्न अपने सभी ajax कॉल है। जो अनिवार्य रूप से सिर्फ XmlHttpRequest बना रहा है और यही वह है जो अजाक्स कॉल से लौटाया जाता है। तो

requests.push(
    $.ajax({ 
     type: 'post', 
     url: '/test.php', 
     data: search_data, 
     success: function(data) { 
      $('#catalog').html(data); 
     } 
    })); 

यह आपके अनुरोधों को एक अनुरोध सरणी में जोड़ देगा जिसे आप कहीं भी परिभाषित कर सकते हैं। फिर जब आप सभी लंबित अनुरोधों को मारना चाहते हैं तो आप सरणी के माध्यम से लूप कर सकते हैं और निरस्त कॉल कर सकते हैं जो अनुरोध को मार देगा।

for(var i = 0; i < requests.length; i++) 
    requests[i].abort(); 

या सिर्फ अपने कार्य एक झंडा यह बताते हैं कि एक अनुरोध किया जा रहा है यह है कि के बाहर एक चर परिभाषित करते हैं। आप इसे और अधिक विशिष्ट बना सकते हैं और खोज डेटा स्टोर कर सकते हैं और केवल उन अनुरोधों को छोड़ सकते हैं जिनके पास एक ही डेटा के लिए लंबित अनुरोध है और विभिन्न डेटा के लिए अन्य अनुरोधों की अनुमति दें।

उम्मीद है कि आपको शुरू करने के लिए पर्याप्त है।

2

वर्तमान अनुरोध के हैंडल को पकड़ने के लिए वैश्विक चर का उपयोग करें। इस मामले में var a फ़ंक्शन के बाहर घोषित करें और इसे वैश्विक बनाएं। AJAX जांच को कॉल करने से पहले यह शून्य नहीं है। यदि यह शून्य नहीं है abort यह अन्य बुद्धिमान इसे नए AJAX के साथ असाइन करें। सफलता/पूर्ण घटना में सुनिश्चित करें कि आप चर को साफ़ करते हैं। वहां सबसे अच्छा समाधान नहीं हो सकता है, लेकिन सबसे अच्छा काम करता है।

4
jQuery AjaxManager Plugin साथ

सुंदर आसान:

$.manageAjax.create('unique_identifier',{ 
queue:'clear',cacheResponse:false,maxRequests:1,abortOld:true 
}); 
jQuery.manageAjax.abort('unique_identifier'); 
jQuery.manageAjax.clear('unique_identifier'); 
jQuery.manageAjax.add('unique_identifier',{success: function(data) {}}); 
23

Spinon का जवाब सभी ajax प्रश्नों लेकिन सिर्फ एक का ट्रैक रखने के लिए महान नहीं निरस्त लिए अच्छा है।

मैं अक्सर अपने आप को

var ajax_request; 
function do_something() 
{ 
    if(typeof ajax_request !== 'undefined') 
     ajax_request.abort(); 
    ajax_request = $.ajax({ 
     type: 'post', 
     url: '/test.php', 
     data: search_data, 
     success: function(data) { 
      $('#catalog').html(data); 
     } 
    }); 
} 
+1

+1 की तरह कुछ कर रही मैं यह बिल्कुल वैसा ही विधि का उपयोग कर सकते हैं। ('AJAX_request' var name ^^ को छोड़कर) ... और यह ठीक काम करता है! – JoDev

+0

मैंने अभी 'var ajax_request;' 'var ajax_request = new XMLHttpRequest(); 'और यह काम कर रहा है। विचार के लिए +1। – smartrahat

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