का उपयोग करके AJAX कॉल को कैसे चेन करें I ब्राउज़र को लॉक किए बिना एन AJAX अनुरोधों की एक श्रृंखला बनाने की आवश्यकता है, और इसे पूरा करने के लिए jquery स्थगित ऑब्जेक्ट का उपयोग करना चाहते हैं।jquery
यहां तीन अनुरोधों के साथ एक सरलीकृत उदाहरण है, लेकिन मेरे प्रोग्राम को 100 से अधिक कतारबद्ध करने की आवश्यकता हो सकती है (ध्यान दें कि यह सटीक उपयोग केस नहीं है, वास्तविक कोड को चरण की सफलता सुनिश्चित करने की आवश्यकता है (एन -1)
:$(document).ready(function(){
var deferred = $.Deferred();
var countries = ["US", "CA", "MX"];
$.each(countries, function(index, country){
deferred.pipe(getData(country));
});
});
function getData(country){
var data = {
"country": country
};
console.log("Making request for [" + country + "]");
return $.ajax({
type: "POST",
url: "ajax.jsp",
data: data,
dataType: "JSON",
success: function(){
console.log("Successful request for [" + country + "]");
}
});
}
यहाँ कंसोल में लिखा जाता है (सभी अनुरोधों को समानांतर में बने होते हैं और प्रतिक्रिया समय सीधे प्रत्येक देश के लिए डेटा का आकार के लिए आनुपातिक अपेक्षा के अनुरूप है: अगले कदम के लिए) निष्पादित करने से पहले
Making request for [US]
Making request for [CA]
Making request for [MX]
Successful request for [MX]
Successful request for [CA]
Successful request for [US]
मैं स्थगित वस्तु को कैसे प्राप्त कर सकता हूं मेरे लिए इन कतार? मैंने पाइप में बदलने की कोशिश की है लेकिन एक ही परिणाम प्राप्त करें।
यहाँ वांछित परिणाम है:
Making request for [US]
Successful request for [US]
Making request for [CA]
Successful request for [CA]
Making request for [MX]
Successful request for [MX]
संपादित करें:
मैं अनुरोध पैरामीटर स्टोर करने के लिए एक सरणी का उपयोग करने के सुझाव की सराहना करते हैं, लेकिन jQuery टाल वस्तु अनुरोध क़तार में क्षमता है और मैं वास्तव में यह जानना चाहता हूं कि इस सुविधा का पूर्ण क्षमता कैसे उपयोग करें।
:when(request[0]).pipe(request[1]).pipe(request[2])... pipe(request[N]);
हालांकि, मैं आदेश में प्रभावी रूप प्रत्येक ट्रेवर्सल का उपयोग करने के लिए एक समय में एक कदम पाइप में अनुरोध प्रदान करना चाहते हैं:
यह मैं क्या करने की कोशिश कर रहा हूँ प्रभावी रूप से है
deferred.pipe(request[0]);
deferred.pipe(request[1]);
deferred.pipe(request[2]);
यह उत्तर निश्चित रूप से काम करता है, मैं इसे सभी को पचाने की कोशिश कर रहा हूं क्योंकि यह काफी जटिल है।धन्यवाद! – Graham
मुझे लगता है कि मैं इसे अब देख रहा हूं। मेरे मूल कोड और आपके बीच का मुख्य अंतर यह प्रतीत होता है कि आप प्रत्येक अनुरोध के लिए डिफर्ड ऑब्जेक्ट्स बना रहे हैं, जहां मेरा एक भी डिफर्ड का उपयोग करने का प्रयास कर रहा था। क्या मैं सही हूँ? – Graham
आपके लिए कुछ विशिष्ट प्रश्न: (1) जब आप पहले से ही अजाक्स कॉल से वादे वापस कर रहे हैं तो आप स्पष्ट रूप से एक वादा क्यों वापस कर सकते हैं? (2) "यह" "आत्म" को क्यों मान रहे हैं? (3) आपने पाइप() का उपयोग क्यों नहीं किया जब वह देशी jquery queue function है? (4) जब हम प्रत्येक अनुरोध के लिए डिफर्ड ऑब्जेक्ट्स बना रहे हैं, तो जब मैं "कतार" में सैकड़ों अनुरोधों को खिलााना शुरू करता हूं तो स्मृति आवश्यकता क्या होती है? एक डिफरर्ड ऑब्जेक्ट कितना हल्का है? – Graham