@Ivo ने जो सुझाव दिया है, उसके लिए एक क्लीनर विकल्प एक अतुल्यकालिक विधि कतार होगा , यह मानते हुए कि आपको केवल संग्रह के लिए एक async कॉल करने की आवश्यकता है।
( अधिक विस्तृत विवरण के लिए डस्टिन डियाज़ की यह पोस्ट देखें )
function Queue() {
this._methods = [];
this._response = null;
this._flushed = false;
}
(function(Q){
Q.add = function (fn) {
if (this._flushed) fn(this._response);
else this._methods.push(fn);
}
Q.flush = function (response) {
if (this._flushed) return;
this._response = response;
while (this._methods[0]) {
this._methods.shift()(response);
}
this._flushed = true;
}
})(Queue.prototype);
आप बस एक नया उदाहरण बनाते हैं Queue, आपके द्वारा आवश्यक कॉलबैक जोड़ते हैं, और फिर async प्रतिक्रिया के साथ कतार को फ्लश करते हैं।
var queue = new Queue();
queue.add(function(results){
for (var result in results) {
}
});
someFunction(param1, param2, function(results) {
queue.flush(results);
}
इस पैटर्न का एक अतिरिक्त लाभ यह है कि आप केवल एक के बजाय कतार में कई फ़ंक्शन जोड़ सकते हैं।
यदि आपके पास कोई ऑब्जेक्ट है जिसमें पुनरावृत्ति कार्य शामिल हैं, तो आप पर्दे के पीछे इस कतार के लिए समर्थन जोड़ सकते हैं और कोड लिख सकते हैं जो तुल्यकालिक दिखता है, लेकिन नहीं:
MyClass.each(function(result){ ... })
बस eachइसे निष्पादित करने के बजाय अनाम फ़ंक्शन को कतार में रखने के लिए लिखें , और फिर जब आपका async कॉल पूरा हो जाए तो कतार को फ्लश करें। यह एक बहुत ही सरल और शक्तिशाली डिजाइन पैटर्न है।
PS यदि आप jQuery का उपयोग कर रहे हैं, तो आपके पास पहले से ही jQuery.Deferred नामक अपने निपटान में एक async विधि कतार है ।
( /* ... */ )एक राक्षस की तरह दिखता है और अब मैं डर रहा हूँ :(