2014-05-15 3 views
5

मैं देशी जावास्क्रिप्ट का उपयोग करने के लिए बाध्य हूं (हालांकि एक jQuery समाधान भी काम कर सकता है अगर मैं इसे मूल जावास्क्रिप्ट में परिवर्तित करता हूं)।जावास्क्रिप्ट में, मैं परीक्षण कैसे कर सकता हूं अगर किसी दिए गए पल में पृष्ठभूमि में कोई AJAX कॉल चल रहा है?

इसके अलावा, मेरे पास मौजूदा AJAX अनुरोधों के लिए कोई संभाल नहीं है, इसलिए मैं उन्हें सीधे एक्सेस नहीं कर सकता।

var ajaxRequestsInProgress = document.getAllAjaxRunning(); 
ajaxRequestsInProgress[1].getStatus(); // will return the status of the request, for example 

तो मैं इस वस्तु का उपयोग और जाँच/हेरफेर मौजूदा ajax अनुरोध कर सकते हैं:

मैं की तरह कुछ खोज कर रहा हूँ।

उत्तर

7

यह है, हम कहेंगे, थोड़ा मुश्किल। ऐसा करने का कोई मूल तरीका नहीं है। इसलिए हमें देशी XMLHttpRequest फ़ंक्शंस को संशोधित करने, कुछ हैकिंग करने की आवश्यकता है। कुछ इस तरह:

var getAJAXRequests = (function() { 
    var oldSend = XMLHttpRequest.prototype.send, 
     currentRequests = []; 

    XMLHttpRequest.prototype.send = function() { 
     currentRequests.push(this); // add this request to the stack 
     oldSend.apply(this, arguments); // run the original function 

     // add an event listener to remove the object from the array 
     // when the request is complete 
     this.addEventListener('readystatechange', function() { 
      var idx; 

      if (this.readyState === XMLHttpRequest.DONE) { 
       idx = currentRequests.indexOf(this); 
       if (idx > -1) { 
        currentRequests.splice(idx, 1); 
       } 
      } 
     }, false); 
    }; 

    return function() { 
     return currentRequests; 
    } 
}()); 

यह getAJAXRequests() साथ कहा जा सकता है।

आप इसे on jsFiddle पर देख सकते हैं।

+0

बहुत अच्छा तरीका! प्रेषण() विधि को "पुनः परिभाषित" करके, आप बेसमेंट में काम कर रहे हैं, जिससे आप * किसी * XMLHttpRequest का ट्रैक रखने में सक्षम होते हैं - इससे कोई फर्क नहीं पड़ता कि कौन सा ढांचा या एडन जारी किया गया है। – rplantiko

+1

क्या इसके बाद पुरानी Send.apply लाइन को स्थानांतरित करना समझ जाएगा .addEventListener? इवेंट श्रोता जोड़ा जाने से पहले प्रतिक्रिया वापस आने के लिए असंभव प्रतीत होता है, लेकिन शायद यह सैद्धांतिक रूप से संभव है? –

+0

यह ठीक काम करता है, धन्यवाद! – Akuma

-2

मुझे पता है कि आपने विशेष रूप से Mootools समाधान के लिए नहीं पूछा है, लेकिन मैंने ऐसा कुछ किया है जिसे मैंने सोचा था कि मैं दूसरों के संदर्भ के लिए यहां साझा करूंगा। मैं विभिन्न अनुरोध विधियों को ओवरराइड करके इसे प्राप्त करता हूं। मैं वर्तमान में संस्करण 1.5.1 का उपयोग कर रहा हूं, लेकिन यह या कुछ अन्य संस्करणों पर समान काम करना चाहिए।

(function() { 
    var requestCounter = 0, 
     send = Request.prototype.send, 
     cancel = Request.prototype.cancel, 
     onSuccess = Request.prototype.onSuccess, 
     onFailure = Request.prototype.onFailure, 
     timeout = Request.prototype.timeout; 

    var increment = function() { 
     ++requestCounter; 
    }; 

    var decrement = function() { 
     --requestCounter; 

     if (requestCounter < 0) { 
      requestCounter = 0; 
     } 
    }; 

    Request.implement({ 
     send: function() { 
      increment(); 
      return send.apply(this, arguments); 
     }, 
     cancel: function() { 
      decrement(); 
      return cancel.apply(this, arguments); 
     }, 
     onSuccess: function() { 
      decrement(); 
      return onSuccess.apply(this, arguments); 
     }, 
     onFailure: function() { 
      decrement(); 
      return onFailure.apply(this, arguments); 
     }, 
     timeout: function() { 
      decrement(); 
      return timeout.apply(this, arguments); 
     } 
    }); 

    Request.getRunningCount = function() { 
     return requestCounter; 
    }; 
})(); 

अब हर बार एक अनुरोध किया जाता है, काउंटर भी वृद्धि होगी और जब यह पूरा हो गया है, यह घटती जाएगी।

var request1 = new Request(...); 
var request2 = new Request(...); 

request1.send(); 
request2.send(); 
console.log(Request.getRunningCount()); // 2 

request1.cancel(); 
console.log(Request.getRunningCount()); // 1 

// request2 completes 
console.log(Request.getRunningCount()); // 0 
+0

यह प्रश्न का उत्तर नहीं प्रदान करता है। किसी लेखक से स्पष्टीकरण की आलोचना करने या अनुरोध करने के लिए, अपनी पोस्ट के नीचे एक टिप्पणी छोड़ दें - आप हमेशा अपनी पोस्ट पर टिप्पणी कर सकते हैं, और एक बार आपके पास पर्याप्त [प्रतिष्ठा] (http://stackoverflow.com/help/whats-reputation) हो [किसी भी पोस्ट पर टिप्पणी करने में सक्षम] [http://stackoverflow.com/help/privileges/comment)। –

+0

मैं इस बात से असहमत हूं कि मेरी प्रतिक्रिया बहुत दूर थी - केवल अंतर यह देशी जावास्क्रिप्ट नहीं है। अन्यथा, यह उपर्युक्त प्रतिक्रिया के बहुत करीब है। साथ ही, तथ्य यह है कि मैं एक उत्तर की तलाश में आया और इस पोस्ट में भाग गया, मैंने सोचा कि मैं भविष्य में दूसरों के लिए एक समान, लेकिन थोड़ा अलग विकल्प प्रदान करूंगा। – philthathril

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

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