दिलचस्प पोस्ट
JQuery के साथ एक आइफ्रेम पुनः लोड करें कस्टम कंपाइलर चेतावनी सत्र का उपयोग किए बिना एएसपी.एक्स.के. के पृष्ठों के मूल्यों को कैसे पारित किया जाए पुस्तकालय लोड नहीं किया जा सकता है: reloc_library : 'रैंड' का पता नहीं लगा सकता एक बहुआयामी चर लंबाई सरणी एक समारोह में पासिंग सीएसएस IE में संपत्ति बारी बारी से सी ++: क्लास डेटा सदस्य को पॉइंटर ":: *" Isset और array_key_exists के बीच का अंतर स्विफ्ट कोड को ऑब्जेक्टिव-सी में कैसे आयात करें क्या मैटलॉग के डेटर्सर्समोड के एक मैटलप्लिब समकक्ष है? ScrollView Insroll ScrollView जावा: यदि ए का विस्तार बी और बी ऑब्जेक्ट फैलता है, तो यह एकाधिक विरासत है जावास्क्रिप्ट में क्लाइंट का समय क्षेत्र प्राप्त करना पायथन REST (वेब ​​सेवा) ढांचे की सिफारिशें? पैडिंग अमान्य है और हटाया नहीं जा सकता?

आप 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) } }