दिलचस्प पोस्ट
एचटीएमएल में एक ऊर्ध्वाधर रेखा कैसे बनाएं जावा धाराओं में फ्लश () का उद्देश्य क्या है? एंड्रॉइड: "बल बंद" होने के बाद एप्लिकेशन को स्वत: पुनरारंभ कैसे करें? पंक्तियों की संख्या (और प्रत्येक पंक्ति में कॉलम) की गणना करने के लिए कैसे एक पाठ JTextArea में लेता है? यूनिट परीक्षणों (और क्यों) के लिए उचित कोड कवरेज क्या है? एसएफटीपी के माध्यम से किसी सर्वर से फाइल कैसे प्राप्त करें? डेटा का उपयोग करते समय सुझाए गए फ़ाइल नाम निर्दिष्ट करने का कोई तरीका क्या है: यूआरआई? जावास्क्रिप्ट / jQuery के साथ मैं फॉर्म डेटा कैसे प्राप्त करूं? मैं नियंत्रण और इसके बच्चों के लिए पेंटिंग कैसे निलंबित कर सकता हूं? स्थानीय फ़ाइलों को अधिलेखित करने के लिए मैं "git पुल" को कैसे बाध्य कर सकता हूं? असाइनमेंट स्टेटमेंट क्यों एक मान लौटाते हैं? एक वर्ग में सदस्य फ़ंक्शंस के साथ जेनेरिक स्टडी :: फ़ंक्शन ऑब्जेक्ट का उपयोग करना एंड्रॉइड: प्रोग्राम हार्डवेयर से पता चलता है कि डिवाइस हार्डवेयर मेनू बटन है या नहीं पीआईपी के साथ विशिष्ट पैकेज संस्करणों को स्थापित करना ट्यूपल्स में अस्थिर वस्तुओं क्यों हो सकते हैं?

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