दिलचस्प पोस्ट
IE संगतता मोड: 'एक्स-यूए-संगत' टैग 'एज' पीएचपी का इस्तेमाल करते हुए एक ज़िप फ़ाइल के रूप में कई फाइलें डाउनलोड करें हटाने से पहले एक नल सूचक के लिए जाँच करने के लिए कोई कारण है? विजुअल स्टूडियो "बिल्डिंग के दौरान …" कॉपी नहीं कर सके jQuery: एक छवि को रंग (टिंट) लागू करने का एक तरीका है? नेस्टेड अजगर शब्दकोशों और सूचियों में एक कुंजी के सभी घटनाओं को ढूंढें स्विंग अवयव रचना करना: मैं ActionListeners जोड़ने की क्षमता कैसे जोड़ूं? मैं एक Windows सेवा स्थापित करने के लिए एक InstallShield LE प्रोजेक्ट कैसे बनाऊँ? जावा आर एकीकरण? php curl: मैं एक वेब ब्राउज़र की तरह ठीक एक अनुरोध प्राप्त कैसे कर सकता हूँ? 'प्रथम श्रेणी वस्तु' का क्या मतलब है? क्या मैं किसी सी # स्ट्रिंग मान को एक पलायन स्ट्रिंग में परिवर्तित कर सकता हूँ आईओएस / आईफ़ोन पर: "कई खुली फाइलें": खुली फाइलों की सूची (जैसे एलएसओफ़) की आवश्यकता है मोंगोडीबी: एकत्रीकरण ढांचे: अंतिम तिथि वाले दस्तावेज प्रति समूह आईडी प्राप्त करें कीबोर्ड के साथ UITableView और UIViewWillShow

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

Solutions Collecting From Web of "आप 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) } }