दिलचस्प पोस्ट
जावा में स्ट्रिंग पूल क्या है? उपयोगकर्ता डेटा को jqgrid में कैसे पढ़ा जाए? पायथन कोड क्यों संकलित? अमेज़ॅन s3 को एचटीएमएल, जावास्क्रिप्ट और अजाक्स अनुरोध के साथ jQuery के साथ छवि अपलोड करना (कोई PHP नहीं) टीसीपी: क्या दो अलग-अलग सॉकेट बंदरगाह साझा कर सकते हैं? सशर्त त्रिगुट ऑपरेटर का प्रयोग करके लैम्ब्डा के बीच एक फोंक <> सशर्त रूप से मैं कैसे आवंटित कर सकता हूं? कैसे Firebase एंड्रॉइड से सभी बच्चे की सूची प्राप्त करने के लिए क्या एक सबडोमेन पर आधारित एएसपी.नेट एमवीसी रूट बनाना संभव है? PHP: बाहर निकलने का उपयोग (); या मरो(); शीर्षलेख के बाद ("स्थान:"); सीमके: सेटअप स्रोत, लाइब्रेरी और सीएमकेलिस्ट्स टैक्स्ट निर्भरता कैसे करें? Proguard का उपयोग करते समय एक विशेष पैकेज पथ को कैसे रखा जाता है? मैं एमपीआई प्रोग्राम कैसे डीबग कर सकता हूं? शून्य-आधारित माह की संख्या विशिष्ट कुंजी द्वारा बहु-आयामी सरणी को सॉर्ट करें स्टार्टअप पर इनिशियलाइज़ करने के लिए विशेष ऑटो स्टार्ट सर्वलेट का उपयोग करना और एप्लिकेशन डेटा साझा करना

Angularjs $ q.all

मैंने $ q.all को कोणीयर्स में कार्यान्वित किया है, लेकिन मैं कोड काम नहीं कर सकता। यहां मेरा कोड है:

UploadService.uploadQuestion = function(questions){ var promises = []; for(var i = 0 ; i < questions.length ; i++){ var deffered = $q.defer(); var question = questions[i]; $http({ url : 'upload/question', method: 'POST', data : question }). success(function(data){ deffered.resolve(data); }). error(function(error){ deffered.reject(); }); promises.push(deffered.promise); } return $q.all(promises); } 

और यहां मेरा नियंत्रक है जो सेवाओं को बुलाता है:

 uploadService.uploadQuestion(questions).then(function(datas){ //the datas can not be retrieved although the server has responded }, function(errors){ //errors can not be retrieved also }) 

मुझे लगता है कि मेरी सेवा में $ q.all की स्थापना करने में कुछ समस्या है I

वेब के समाधान से एकत्रित समाधान "Angularjs $ q.all"

जावास्क्रिप्ट में कोई block-level scopes केवल function-level scopes :

जावास्क्रिप्ट स्क्रॉपिंग और होस्टिंग के बारे में इस लेख को पढ़ें।

देखें कि मैं आपके कोड को कैसे डीबग करता हूं:

 var deferred = $q.defer(); deferred.count = i; console.log(deferred.count); // 0,1,2,3,4,5 --< all deferred objects // some code .success(function(data){ console.log(deferred.count); // 5,5,5,5,5,5 --< only the last deferred object deferred.resolve(data); }) 
  • जब आप var deferred= $q.defer(); फ़ंक्शन के शीर्ष पर फहराए जाने वाले लूप के अंदर, इसका अर्थ है कि जावास्क्रिप्ट इस वेरिएबल को फ़ंक्शन गुंजाइश के for loop बाहर घोषित करता है।
  • प्रत्येक लूप के साथ, पिछले आस्थगित पिछले एक को ओवरराइड कर रहा है, उस ऑब्जेक्ट के संदर्भ को सहेजने के लिए कोई ब्लॉक-स्तरीय क्षेत्र नहीं है।
  • जब अतुल्यकालिक कॉलबैक (सफलता / त्रुटि) को लागू किया जाता है, तो वे केवल अंतिम आस्थगित वस्तु का संदर्भ देते हैं और केवल इसका समाधान हो जाता है, इसलिए $ q.all का समाधान कभी नहीं होता क्योंकि यह अभी भी अन्य आस्थगित वस्तुओं के लिए प्रतीक्षा करता है
  • आपको जो आइटम की आवश्यकता है वह प्रत्येक आइटम के लिए गुमनाम समारोह बनाने की आवश्यकता है
  • फ़ंक्शन के पास कार्य करने के बाद भी, आस्थगित वस्तुओं के संदर्भ को closure scope में संरक्षित किया जाता है।
  • जैसा कि #dfsq ने टिप्पणी की है: $ HT स्वयं एक वादा वापस करता है क्योंकि मैन्युअल रूप से एक नई आस्थगित वस्तु का निर्माण करने की कोई आवश्यकता नहीं है

angular.forEach साथ समाधान। angular.forEach :

यहां एक डेमो प्लंकर है: http://plnkr.co/edit/NGMp4ycmaCqVOmgohN53?p=preview

 UploadService.uploadQuestion = function(questions){ var promises = []; angular.forEach(questions , function(question) { var promise = $http({ url : 'upload/question', method: 'POST', data : question }); promises.push(promise); }); return $q.all(promises); } 

मेरा पसंदीदा तरीका Array#map का उपयोग करना है:

यहां एक डेमो प्लंकर है: http://plnkr.co/edit/KYeTWUyxJR4mlU77svw9?p=preview

 UploadService.uploadQuestion = function(questions){ var promises = questions.map(function(question) { return $http({ url : 'upload/question', method: 'POST', data : question }); }); return $q.all(promises); } 

$ http एक वादा भी है, आप इसे सरल बना सकते हैं:

 return $q.all(tasks.map(function(d){ return $http.post('upload/tasks',d).then(someProcessCallback, onErrorCallback); })); 

समस्या यह हो रही है कि आप deffered.promise जोड़ रहे हैं जब deffered खुद ही वादा तुम जोड़ना चाहिए:

promises.push(deffered); को बदलने की कोशिश करें promises.push(deffered); तो आप सरणी के लिए बिना किसी दिए गए वादे को जोड़ते हैं।

  UploadService.uploadQuestion = function(questions){ var promises = []; for(var i = 0 ; i < questions.length ; i++){ var deffered = $q.defer(); var question = questions[i]; $http({ url : 'upload/question', method: 'POST', data : question }). success(function(data){ deffered.resolve(data); }). error(function(error){ deffered.reject(); }); promises.push(deffered); } return $q.all(promises); }