2015-07-07 7 views
14

पर सफल वादे समाधान से मूल्य असाइन करें मेरे पास एक सुंदर मूर्ख समस्या है। निम्नलिखित पर विचार करें:बाहरी वैरिएबल

vm.feed = getFeed().then(function(data) {return data;}); 

getFeed() एक $ q टाल वादा (मैं कोणीय पर हूँ) है कि सफलतापूर्वक विभाजित देता है।

मेरा लक्ष्य सफल कॉलबैक द्वारा लौटाए गए डेटा मान के बराबर vm.feed सेट करना है। चूंकि यह अभी है, कोड द्वारा लौटाए गए $promise ऑब्जेक्ट के बराबर vm.feed असाइन करता है।

मुझे पता है कि मैं बस हल कर सकता हूं: vm.feed = data हल किए गए फ़ंक्शन के अंदर लेकिन मैं समझना चाहता हूं कि यह कोड क्यों काम नहीं करता है।

पीडी: वादा सही ढंग से हल हो जाता है और इसे हल करने के बाद भी vm.feed वादा के बराबर रहता है, न कि डेटा। मैं vm.feed की console.log नकल के बाद 10 सेकंड गुजर चुके है

Promise {$$state: Object} $$state: Objectstatus:1 value: Object 

कि मूल्य संपत्ति वादा ऑब्जेक्ट के अंदर वादा है कि मैं vm.feed को असाइन करना चाहते का वास्तविक समाधान (Ei data शामिल)।

धन्यवाद!

+0

उपयोग vm.feed = getFeed()। फिर (फ़ंक्शन (डेटा) {वापसी डेटा.data;}); – ngLover

+0

वादा किसी कारण से लौटाया गया है: परिणाम तुरंत उपलब्ध नहीं है, लेकिन कुछ देरी के बाद। इसे ग्लोबल वैरिएबल में असाइन करने से सभी प्रकार की सिंक्रनाइज़िंग समस्याओं का दरवाजा खुलता है (क्या डेटा पहले से मौजूद है?)। सबसे अच्छा समाधान वादे के कॉलबैक में लौटाए गए डेटा से जुड़े सभी कार्यक्षमताओं को ट्रिगर करना है। – Sirko

+1

यदि 'getFeed'' $ http' का उपयोग करने के बजाय '$ संसाधन' का उपयोग करने पर विचार करें, तो यह एक खाली वस्तु (एक वादा नहीं) वापस लौटाएगा जब संसाधन प्रतिक्रिया – fantarama

उत्तर

9

आपका कथन दुभाषिया से then() से vm.feed चर पर लौटाए गए मान को असाइन करने के लिए कुछ भी नहीं करता है। then() आपको एक वादा देता है (जैसा कि आप यहां देख सकते हैं: https://github.com/angular/angular.js/blob/master/src/ng/q.js#L283)। आप इसे देखकर चित्रित कर सकते हैं कि वादा (एक साधारण वस्तु) फ़ंक्शन से खींच लिया गया है और vm.feed पर असाइन किया जा रहा है। ऐसा होता है जैसे दुभाषिया उस पंक्ति को निष्पादित करता है।

के बाद से अपने सफल कॉलबैक नहीं चलता है जब आप then() फोन, लेकिन केवल जब अपने वादे का समाधान हो जाता है (बाद में एसिंक्रोनस) यह असंभव होगा then() फोन करने वाले के लिए अपने मूल्य के लिए वापस जाने के लिए। जावास्क्रिप्ट काम करता है यह डिफ़ॉल्ट तरीका है। यह सही कारण था कि वादे पेश किए गए थे, इसलिए आप कॉलबैक के रूप में दुभाषिया से पुश पर मूल्य पूछ सकते हैं।

हालांकि भविष्य के संस्करण पर जावास्क्रिप्ट (ES2016) के लिए काम किया जा रहा है, लेकिन कुछ कीवर्ड काम करने के लिए पेश किए जाएंगे, जैसा कि आप अभी उम्मीद कर रहे हैं। अच्छी खबर यह है कि आप आज इस तरह कोड लिखना शुरू कर सकते हैं ES2016 से वर्तमान व्यापक रूप से समर्थित संस्करण (ईएस 5) में पारदर्शीकरण के माध्यम से।https://www.youtube.com/watch?v=lil4YCCXRYc

अभी इसका इस्तेमाल करने के लिए आप कोलाहल के माध्यम से अपने कोड transpile कर सकते हैं:: (--stage 1 साथ चलाकर) https://babeljs.io/docs/usage/experimental/

विषय के लिए एक अच्छा परिचय पर उपलब्ध है।

आप यहां कुछ उदाहरण भी देख सकते हैं: https://github.com/lukehoban/ecmascript-asyncawait

+0

प्रश्नपत्र में वादे हल हो जाने के बाद मैंने vm.feed मान की प्रतिलिपि बनाई; यह अभी भी वादा ऑब्जेक्ट के बराबर है, न कि 'डेटा', क्या वादा हल हो जाने के बाद यह नहीं बदला जाना चाहिए? –

+0

जावास्क्रिप्ट में, चर के पास उनके मूल्य को उपयोगकर्ता कोड द्वारा सेट किया गया है। एक बार दुभाषिया कोड की उस पंक्ति को चलाया, यह वैरिएबल को तब तक नहीं बदलेगा जब तक आपके द्वारा दिए गए किसी अन्य निर्देश को किसी अन्य चीज़ के लिए अपना मूल्य निर्धारित न हो जाए। – Nathan

+0

FYI जो आप प्राप्त करने का प्रयास कर रहे हैं वह 'await' कीवर्ड के साथ ES2016 में उपलब्ध होगा। यदि आप रुचि रखते हैं: https://www.youtube.com/watch?v=lil4YCCXRYc :) – Nathan

4

then() विधि एक वादा देता है। इसमें दो तर्क होते हैं, दोनों वादे के सफलता और विफलता के मामलों के लिए कॉलबैक फ़ंक्शंस हैं। वादा ऑब्जेक्ट स्वयं आपको हल किए गए डेटा को सीधे नहीं देता है, इस ऑब्जेक्ट का इंटरफ़ेस केवल कॉलबैक के माध्यम से डेटा प्रदान करता है। तो, अगर आप इस तरह यह करने के लिए है:

getFeed().then(function(data) { vm.feed = data;}); 

then() समारोह पिछले then() कॉलबैक का एक संकल्प लिया मूल्य के साथ वादा देता है, आप बाद में कॉलबैक करने के लिए मान पास की इजाजत दी:

promiseB = promiseA.then(function(result) { 
    return result + 1; 
}); 

// promiseB will be resolved immediately after promiseA is resolved 
// and its value will be the result of promiseA incremented by 1 
+0

मैं सहमत हूं लेकिन अगर कॉलबैक हल किए गए डेटा को वापस लौटाता है तो क्या यह वादा ऑब्जेक्ट के बाहर उपलब्ध नहीं होना चाहिए? –

+1

सफलता कॉलबैक का वापसी मूल्य बाद की सफलता कॉलबैक की सफलता कॉलबैक में पारित किया जाता है, जिससे आप कॉल चेन (उत्तरदायित्व की श्रृंखला) के साथ उत्परिवर्तित मूल्य पारित करने की अनुमति देते हैं – BhavO

3

यह तीर कार्यों के साथ ES6 के लिए अद्यतन किया जा सकता है और की तरह लग रहे:

getFeed().then(data => vm.feed = data); 

आप async function का उपयोग करना चाहते हैं, तो आप भी ऐसा कर सकता है:

async function myFunction(){ 
    vm.feed = await getFeed(); 
    // do whatever you need with vm.feed below 
} 
संबंधित मुद्दे