दिलचस्प पोस्ट
jQuery .add () / .ajax () संलग्न HTML में जावास्क्रिप्ट क्रियान्वित नहीं करने के बाद WebView एंड्रॉइड प्रॉक्सी क्वेरी स्ट्रिंग के लिए htaccess पुनर्लेखन पासवर्ड इनपुट के बाद चमकदार ऐप प्रारंभ करना रिश्तेदार से एक पूर्ण यूआरएल प्राप्त करना (आई 6 अंक) जावा में जेनरिक प्रकार का इंस्टायनियेट करना क्या ओपनURL का उपयोग कर सेटिंग्स ऐप खोलना संभव है? मैं jQuery ऑब्जेक्ट से चयनकर्ता कैसे प्राप्त कर सकता हूं C में scanf () में "\ n" का उपयोग करना Apache HttpClient 4.0 में SSL प्रमाणपत्र त्रुटियों को कैसे अनदेखा करें हम $ रूटस्स्कोप का उपयोग क्यों करते हैं। $ AngularJS में प्रसारित है? स्टोरीबोर्ड में UIScrollView का उपयोग कैसे करें तत्वों के केन्द्रित ग्रिड में वाम संरेखित पिछली पंक्ति सबप्रोसेस में अंतर। पोपैन और ओएससिस्टम स्ट्रिंग "3" से कम स्ट्रिंग "11" क्यों है?

AngularJS: $ q -> आस्थगित एपीआई चीजों के आदेश (जीवन चक्र) और जो डाइजेक्ट को आमंत्रित करता है?

$ Q सेवा को कोणीयर्स में बहुत शक्तिशाली है और हमारे जीवन को अतुल्यकालिक कोड के साथ आसान बनाते हैं।

मैं कोणीय के लिए नया हूँ लेकिन आस्थगित एपीआई का उपयोग करना मेरे लिए बहुत नया नहीं है मुझे यह कहना चाहिए कि दस्तावेज के भाग का How to use I के साथ पूरी तरह से ठीक है + दस्तावेज के भीतर इसके लिए बहुत उपयोगी लिंक्स हैं I +

मेरा प्रश्न आक्षेप के हुड भागों के नीचे और एओआई ऑब्जेक्ट्स को कोणीय के बारे में अधिक है उनके जीवन चक्र में सटीक चरणों क्या हैं और वे rootScope.Scope के साथ कैसे संपर्क करते हैं। rootScope.Scope (एस) मेरी धारणा यह है कि जब वादा हल होता है – यह डाइजेस्ट पाश को कहता है ??? हाॅं नही ?

निम्नलिखित पहलुओं की विशिष्ट सूची के लिए विशिष्ट सम्मान के साथ एक विस्तृत उत्तर प्रदान कर सकते हैं:

  1. आपके प्रत्येक वर्णित चरणों / चरणों में होने वाली चीजों का क्रम क्या है
  2. जब एक नए वादे के उदाहरण के साथ नया आस्थगित वस्तु बनाई गई – जो इसे जानते हैं / क्या यह महत्वपूर्ण है?
  3. वादा ऑब्जेक्ट का हल होने पर गुंजाइश कैसे ठीक हो जाती है? क्या मुझे इसे कॉलबैक के अंदर मैन्युअल रूप से अद्यतन करना है या डाइजेस्ट स्वचालित रूप से लागू हो जाएगी और रूटस्स्कोप को अपडेट किया जाएगा जैसे कि घोषित किया गया है
  4. वादा कॉलबैक के भीतर से दायरे को अद्यतन करने के कम से कम एक दृष्टिकोण का उल्लेख करें
  5. मैं वहां कई अन्य उपयोगी पहलुओं को ग्रहण करता हूं, उन सभी को प्रदान करने में संकोच न करें।

मैं डॉक्स या स्रोत के लिए यथासंभव अधिक से अधिक के संदर्भ के साथ सबसे विस्तृत उत्तर की सराहना करता हूं और स्वीकार करता हूं (जो मुझे स्वयं नहीं मिल सकता था)। मुझे इस विषय के साथ कोई भी पहले चर्चा नहीं मिल रही है, अगर वहां पहले से ही था – लिंक पोस्ट करें।

ps: +1 इस प्रश्न के लिए एक बेहतर शीर्षक का सुझाव देकर किसी भी एक के लिए +1, कृपया अपने सुझाव एक टिप्पणी में जोड़ें।

चीयर्स!

वेब के समाधान से एकत्रित समाधान "AngularJS: $ q -> आस्थगित एपीआई चीजों के आदेश (जीवन चक्र) और जो डाइजेक्ट को आमंत्रित करता है?"

वादे के तीन राज्य हैं

  • लंबित – इस तरह से वादे शुरू होते हैं
  • पूर्ण – यह तब होता है जब आप किसी आस्थगित को हल करते हैं, या जब से वापसी मूल्य। तब पूरा होता है, और यह आम तौर पर एक मानक वापसी मान के अनुरूप होता है।
  • अस्वीकृत – यह तब होता है जब आप किसी आस्थगित को अस्वीकार करते हैं, जब आप किसी से .then हैंडलर throw या जब आप एक वादा वापस करते हैं जो अस्वीकृति के लिए खुलता है, तो यह आम तौर पर एक मानक अपवाद फेंक दिया जाता है।

कोणीय में, वादों को $rootScope.$evalAsync(callback); से सुलझाने का वादा किया जाता है और $rootScope.$evalAsync(callback); माध्यम से समाधान करके उनकी गारंटी देता है $rootScope.$evalAsync(callback); ( यहां से लिया गया)

चूंकि यह $evalAsync माध्यम से चलाया जाता है, $evalAsync हम जानते हैं कि वादा के समाधान के बाद कम से कम एक डायजेस्ट चक्र होगा (सामान्य रूप से), क्योंकि यह एक नया डाइजेस्ट शेड्यूल करेगा अगर कोई प्रगति नहीं है।

यह भी उदाहरण के लिए जब आप rootScope में इकाई परीक्षण rootScope कोड करना चाहते हैं, तो आपको डायजेस्ट लूप (आमतौर पर, rootScope पर $rootScope.digest() माध्यम से चलाने की आवश्यकता होती है क्योंकि $ evalAsync निष्पादन डाइजेस्ट लूप का हिस्सा है।

ठीक है, पर्याप्त बात, मुझे कोड दिखाएं:

नोट: यह एंज्यूलर 1.2 से कोड पथ दिखाता है, कोन्यूलर 1. में कोड पथ सभी समान हैं, लेकिन 1.3+ $ q में प्रोटोटाइपिकल विरासत का उपयोग करने के लिए पुनर्संचित किया गया है, ताकि यह उत्तर कोड में सटीक न हो (लेकिन आत्मा में है) उन संस्करणों

1) जब $ q बनाया जाता है यह ऐसा करता है:

  this.$get = ['$rootScope', '$exceptionHandler', function($rootScope, $exceptionHandler) { return qFactory(function(callback) { $rootScope.$evalAsync(callback); }, $exceptionHandler); }]; 

जो बदले में करता है:

 function qFactory(nextTick, exceptionHandler) { 

और केवल nextTick हल करता nextTick पारित के रूप में $evalAsync अंदर हल और सूचित करें:

  resolve: function(val) { if (pending) { var callbacks = pending; pending = undefined; value = ref(val); if (callbacks.length) { nextTick(function() { var callback; for (var i = 0, ii = callbacks.length; i < ii; i++) { callback = callbacks[i]; value.then(callback[0], callback[1], callback[2]); } }); } } }, 

रूट गुंजाइश पर, $ evalAsync को परिभाषित किया गया है:

  $evalAsync: function(expr) { // if we are outside of an $digest loop and this is the first time we are scheduling async // task also schedule async auto-flush if (!$rootScope.$$phase && !$rootScope.$$asyncQueue.length) { $browser.defer(function() { if ($rootScope.$$asyncQueue.length) { $rootScope.$digest(); } }); } this.$$asyncQueue.push({scope: this, expression: expr}); }, $$postDigest : function(fn) { this.$$postDigestQueue.push(fn); }, 

जो, जैसा कि आप वाकई एक पचाने का समय देख सकते हैं यदि हम एक में नहीं हैं और पहले से कोई डाइजेस्ट निर्धारित नहीं किया गया है। फिर यह फ़ंक्शन $$asyncQueue

$ डाइजेस्ट के अंदर (एक चक्र के दौरान, और नजर रखने वालों की जांच करने से पहले ):

  asyncQueue = this.$$asyncQueue, ... while(asyncQueue.length) { try { asyncTask = asyncQueue.shift(); asyncTask.scope.$eval(asyncTask.expression); } catch (e) { clearPhase(); $exceptionHandler(e); } lastDirtyWatch = null; } 

इसलिए, जैसा कि हम देख सकते हैं, यह $$asyncQueue तब तक चलाता है जब तक कि यह खाली न हो, आपके वादा में कोड निष्पादित हो।

इसलिए, जैसा कि हम देख सकते हैं, गुंजाइश को अद्यतन करना, बस इसे बताए जा रहे हैं, एक डाइजेस्ट चल जाएगा, अगर वह पहले से नहीं चल रहा है, और अगर यह है, वादा के अंदर का कोड, चलने वालों के चलने से पहले $evalAsync पर चलाया जाता है। तो एक सरल:

 myPromise().then(function(result){ $scope.someName = result; }); 

श्वास, इसे सरल रखते हुए

* नोट कोणीय अलग-अलग rejections से फेंकता – फेंक डिफ़ॉल्ट रूप से लॉग किया जाता है और rejections स्पष्ट रूप से लॉग इन करना होगा

जब वादा हल होता है – यह पाचन लूप को आमंत्रित करता है?

हाँ। आप इसे साधारण टेम्पलेट द्वारा जांच सकते हैं:

 {{state}} 

और एक विलंब के बाद $scope.state चर को बदलने वाला नियंत्रक कोड:

 $scope.state = 'Pending'; var d = $q.defer(); d.promise.then(function() { $scope.state = 'Resolved, and digest cycle must have run'; }); $window.setTimeout(function() { d.resolve(); }, 1000); 

आप इसे http://plnkr.co/edit/fIfHYz9EYK14A5OS6NLd?p=preview पर देख सकते हैं। एक सेकंड के बाद, एचटीएमएल में दिए गए पाठ को Resolved, and digest cycle must have runsetTimeout बजाय $timeout को सेट करने के लिए कॉल जानबूझकर है, यह सुनिश्चित करने के लिए कि यह resolve होना चाहिए जो डायजेस्ट लूप शुरू resolve से समाप्त होता है

स्रोत में देखकर इसकी पुष्टि की जाती है: nextTick कॉल के माध्यम से कॉलबैक को nextTick , जो एक ऐसा फ़ंक्शन है जो कॉलबैक को $rootScope.$evalAsync , जो $evalAsync दस्तावेज़ के अनुसार:

अभिव्यक्ति निष्पादन के बाद कम से कम एक $ डाइजेस्ट चक्र किया जाएगा

वही दस्तावेज़ भी कहते हैं:

नोट: यदि यह फ़ंक्शन $ डायजेस्ट चक्र के बाहर कहा जाता है, तो एक नया डाइजेस्ट चक्र निर्धारित किया जाएगा

तो क्या स्टैक पहले से $ डाइजेस्ट लूप में है, घटनाओं का सटीक क्रम बदल सकता है


'1। आपके प्रत्येक वर्णित चरणों / चरणों में होने वाली चीजों का क्रम क्या है

विस्तार से पिछले उदाहरण में जा रहे हैं:

  1. var d = $q.defer(); आस्थगित वस्तु का वादा लंबित स्थिति में है। इस बिंदु पर, वास्तव में कुछ भी नहीं हुआ है, आपके पास resolve , reject , notifiy और promise गुणों के साथ एक स्थगित वस्तु है। $ डाइजेस्ट लूप पर कुछ भी उपयोग नहीं हुआ या प्रभावित हुआ है

  2. d.promise.then(function() { $scope.state = 'Resolved, and digest cycle must have run'; });

    वादा अभी भी एक लंबित राज्य में है, लेकिन then एक सफलता के साथ कॉलबैक पंजीकृत फिर, $ डाइजेस्ट लूप या किसी भी दायरे पर कुछ भी उपयोग नहीं हुआ या प्रभावित नहीं हुआ है

  3. $window.setTimeout(function() { d.resolve(); }, 1000);

    1 सेकंड के बाद, d.resolve कहा जाएगा। यह कॉलबैक से ऊपर चरण 2 में $ evalAsync (nextTick के माध्यम से) में परिभाषित करता है

  4. $ evalAsync कॉलबैक को कॉल करेगा

  5. $ evalAsync फिर एक $ डायजेस्ट चक्र को कहा जाएगा।


'2। जब एक नए वादे के उदाहरण के साथ नया आस्थगित वस्तु बनाई गई – जो इसे जानते हैं / क्या यह महत्वपूर्ण है?

केवल $q.defer() का कॉलर resolved होने तक किसी भी दायरे के संबंध में कुछ नहीं होता है (या वास्तव में, reject या notify )।


'3। वास्तव में कैसे गुंजाइश अद्यतन वादा वस्तु हल किया जा रहा है? क्या मुझे इसे कॉलबैक के अंदर मैन्युअल रूप से अद्यतन करना है या डाइजेस्ट स्वचालित रूप से लागू हो जाएगी और रूटस्स्कोप को अपडेट किया जाएगा जैसे कि घोषित किया गया है

जैसा कि उल्लेख किया गया है, $ डायजेस्ट पाश को स्वतः कॉल resolve शुरू हो जाएगा (यदि यह पहले से ही नहीं है)


'4। वादा कॉलबैक के भीतर से दायरे को अद्यतन करने के कम से कम एक दृष्टिकोण का उल्लेख करें

उपरोक्त उदाहरण यह देता है


'5। मैं वहां कई अन्य उपयोगी पहलुओं को ग्रहण करता हूं, उन सभी को प्रदान करने में संकोच न करें।

जिसके बारे में मैंने सोचा था, वह नहीं है!