दिलचस्प पोस्ट
सी # में नामस्थानों का उपयोग आईफ़ोन कोडन ऑब्जेक्ट फ़ाइल प्रारूप अमान्य या अनुपयुक्त JPQL को दोबारा "JPEG 2" के रूप में "कहाँ" खंड के साथ "फ़ेच में शामिल करें" को व्यक्त करने के लिए? सी # वस्तुओं के लिए लेनदेन? टैब में आइकन दिखाई नहीं दे रहा है एसिंक पद्धति को कॉल करना सिंक्रोनस रूप से सी # परीक्षा अगर उपयोगकर्ता ने किसी फ़ोल्डर में प्रवेश लिखना है स्प्रिंग कैसे काम करता है? अजाक्स अद्यतन / रेंडर एक घटक पर काम नहीं करता है जो विशेषता प्रदान की है जावास्क्रिप्ट सरणियाँ एक दूसरे के बराबर नहीं हो सकतीं? डाटाबेस में पदानुक्रमित डेटा संरचना को कार्यान्वित करना AVQueuePlayer के लिए पूर्व बफरिंग एचटीएमएल 5 में वीडियो की गति को कैसे बदल सकता है? कस्टम HttpMessageConverter @ResponseBody के साथ Json चीजें करने के लिए जीडीबी में एक प्रक्रिया कैसे संलग्न करें

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

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