दिलचस्प पोस्ट
कैसे jquery कुकी में एक सरणी को स्टोर करने के लिए? Android एप्लिकेशन को विकसित करने के लिए सबसे अच्छा आईडीई क्या है? Invoke () और BeginInvoke () के बीच अंतर क्या है रनटाइम पर जेवीएम हीप आकार सेट करना ENTER पर <div> को जोड़ने में संतोषजनक रोकें – क्रोम एसएसपी सर्वर पर एसएसपी सर्वर में कनेक्शन स्ट्रिंग को सेट करना regex.test वीएस string.match पता करने के लिए कि एक स्ट्रिंग एक नियमित अभिव्यक्ति से मेल खाता है कैश बनाम सत्र का लाभ जावा में एक नई सूची कैसे बनाएं मैं 'शुद्ध' स्विफ्ट (w / o @objc) में एक कमजोर प्रोटोकॉल संदर्भ कैसे बना सकता हूं सी # में गतिशील रूप से एक क्लास कैसे बनाइए? वीआईएम से निष्पादित आदेश बाश कमान aliases पहचान नहीं कर रहे हैं GitHub को धकेलने में त्रुटि – रिपॉजिटरी डेटाबेस को ऑब्जेक्ट जोड़ने के लिए अपर्याप्त अनुमति जावा के लिए फास्ट ट्रांसएंडेंड / त्रिकोणमितीय फ़ंक्शन Windows पर स्पार्क कैसे सेट अप करें?

आप jQuery के डिफरेड्स की एक सरणी के साथ कैसे काम करते हैं?

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

मुझे आरंभीकरण के साथ समस्या आ रही है मैं रूट ऑब्जेक्ट लाने के लिए एक अजाक्स कॉल का उपयोग करता हूं, $। जब (), और तब वादे के एक सरणी बनाएं, प्रत्येक स्कीमा ऑब्जेक्ट के लिए एक यह काम करता है। मैं कंसोल में फ़ेच देखता हूँ

मैं तब सभी स्कीमाओं के लिए फ़ेच देखता हूं, इसलिए प्रत्येक $। एजेक्स () कॉल काम करता है फ़ेचस्केमास () वास्तव में वादे की एक सरणी वापस करता है

हालांकि, वह अंतिम जब () खंड कभी नहीं आग लगा है और कंसोल पर "कभी भी" शब्द कभी नहीं दिखाई देता है Jquery-1.5 के स्रोत कोड का अर्थ है कि "रिक्त" $ वस्तु को पास करने के लिए एक ऑब्जेक्ट के रूप में स्वीकार्य है। जब। एपली (), जब कोई ऑब्जेक्ट नहीं है, तो जब () एक आंतरिक डिफरेड () ऑब्जेक्ट को प्रबंधित करेगा में पारित।

यह फ़्यूचर्स.जेएस का उपयोग करके काम किया। JQuery के डिफरेड्स को कैसे नियंत्रित किया जाना चाहिए, यदि ऐसा नहीं है?

var fetch_schemas, fetch_root; fetch_schemas = function(schema_urls) { var fetch_one = function(url) { return $.ajax({ url: url, data: {}, contentType: "application/json; charset=utf-8", dataType: "json" }); }; return $.map(schema_urls, fetch_one); }; fetch_root = function() { return $.ajax({ url: BASE_URL, data: {}, contentType: "application/json; charset=utf-8", dataType: "json" }); }; $.when(fetch_root()).then(function(data) { var promises = fetch_schemas(data.schema_urls); $.when.apply(null, promises).then(function(schemas) { console.log("DONE", this, schemas); }); }); 

वेब के समाधान से एकत्रित समाधान "आप jQuery के डिफरेड्स की एक सरणी के साथ कैसे काम करते हैं?"

आप देख रहे हैं

 $.when.apply($, promises).then(function(schemas) { console.log("DONE", this, schemas); }, function(e) { console.log("My ajax failed"); }); 

यह भी काम करेगा (काम के कुछ मूल्य के लिए, यह टूटे हुए एजेक्स को ठीक नहीं करेगा):

 $.when.apply($, promises).done(function() { ... }).fail(function() { ... });` 

आप null बदले $ से गुजारें चाहते हैं, ताकि this $.when अंदर हो $.when jQuery को संदर्भित करता है यह स्रोत से कोई फर्क नहीं होना चाहिए, लेकिन यह बेहतर है तो null गुजर रहा है।

$ $ के साथ उन्हें अपने प्रति $ .एजेक्स की जगह ले $.when और नमूना काम करता है

इसलिए यह आपके एजेक्स अनुरोध या आपके fetch_schemas के पास जाने वाली एआरएफ़ में एक समस्या है।

ऊपर दिए गए कार्यवाही (धन्यवाद!) आस्थगित के resolve() विधि को प्रदान किए गए ऑब्जेक्ट को वापस लाने की समस्या को सही तरीके से संबोधित नहीं करता है क्योंकि jQuery को कॉल किया done() और fail() व्यक्तिगत पैरामीटर के साथ कॉलबैक, एक सरणी नहीं। इसका मतलब है कि हम सभी हलकों / अस्वीकृत ऑब्जेक्ट्स को ऑर्डर ऑफ सरफेस द्वारा लौटाने के लिए arguments छद्म-अर्रे का इस्तेमाल करना arguments , जो बदसूरत है:

 $.when.apply($, promises).then(function() { var schemas=arguments; // The array of resolved objects as a pseudo-array ... }; 

चूंकि हम स्थगितों की एक सरणी में पारित हो चुके हैं, इसलिए परिणामों की एक सरणी वापस पाने के लिए अच्छा होगा। छद्म सरणी के बजाय एक वास्तविक सरणी वापस पाने के लिए भी अच्छा होगा ताकि हम Array.sort() जैसी विधियों का उपयोग कर सकें।

यहां एक समाधान है जो when.js की जब सभी समस्याओं को संबोधित करते हैं when.all() विधि:

 // Put somewhere in your scripting environment if (jQuery.when.all===undefined) { jQuery.when.all = function(deferreds) { var deferred = new jQuery.Deferred(); $.when.apply(jQuery, deferreds).then( function() { deferred.resolve(Array.prototype.slice.call(arguments)); }, function() { deferred.fail(Array.prototype.slice.call(arguments)); }); return deferred; } } 

अब आप बस स्थगित / वादों की एक सरणी में पारित कर सकते हैं और अपने कॉलबैक में हल किए गए / अस्वीकृत वस्तुओं की एक सरणी वापस प्राप्त कर सकते हैं, जैसे:

 $.when.all(promises).then(function(schemas) { console.log("DONE", this, schemas); // 'schemas' is now an array }, function(e) { console.log("My ajax failed"); }); 

यदि आप जावास्क्रिप्ट के ईएस 6 संस्करण का प्रयोग कर रहे हैं तो एक स्प्रेड ऑपरेटर (…) है जो वस्तुओं की सरणी को अल्पविराम द्वारा अलग-अलग तर्कों में कनवर्ट करता है।

 $.when(...promises).then(function() { var schemas=arguments; }; 

ईएस 6 स्प्रेड ऑपरेटर के बारे में अधिक https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator यहां खोजिए

इस कोड के साथ विस्तारित होता है:

 var rawWhen = $.when $.when = function(promise) { if ($.isArray(promise)) { var dfd = new jQuery.Deferred() rawWhen.apply($, promise).done(function() { dfd.resolve(Array.prototype.slice.call(arguments)) }).fail(function() { dfd.reject(Array.prototype.slice.call(arguments)) }) return dfd.promise() } else { return rawWhen.apply($, arguments) } }