2013-05-01 5 views
16

मेरे पास एक वादा है कि मैं अपने यूआई में बाध्यकारी हूं। जब वादा हल हो जाता है और UI तत्व प्रस्तुत करता है तो मैं उस UI तत्व पर क्लिक कर सकता हूं। मेरे नियंत्रक कोड में जहां मैं क्लिक को संभालता हूं, मैं वादे के मूल्य पर कार्य करना चाहता हूं। इस बिंदु पर मेरे कोणीय कोड में मुझे पहले से ही पता है कि वादा हल हो गया है .. लेकिन जब मैं मूल्य प्राप्त करना चाहता हूं तो यह अभी भी एक वादा है।पहले से हल किए गए वादे का मूल्य कैसे प्राप्त करें?

क्या वादे के मूल्य को प्राप्त करने का सबसे अच्छा तरीका है ... दिया गया है कि मुझे पता है कि इसे हल करना होगा?

उत्तर

21

वादे हमेशा वादे होते हैं - और इसी तरह वे होना चाहिए। हालांकि, सीधे विचार को एक वादा बांधना संभव है, लेकिन मैं आम तौर पर इस अभ्यास को हतोत्साहित करता हूं क्योंकि इसमें पारदर्शिता की कमी होती है और झिलमिलाहट देखने का कारण बन सकती है। एक बेहतर समाधान एक then कॉल में एक गुंजाइश मान देना है:

myService.then(function(val) { 
    $scope.val = val; 
}); 

जब $scope.val के लिए तैयार है, यह हमेशा सीधे एक मूल्य के रूप में व्यवहार किया जा सकता है - क्योंकि यह है।

उसने कहा, अगर आप सीधे वादा कार्य करना चाहते हैं, तो आपको इसे केवल एक वादे की तरह व्यवहार करना होगा; यानी, आपको promise.then(function() { ... }); पर कॉल करने की आवश्यकता है। यह एक असुविधा की तरह प्रतीत होता है, लेकिन वास्तव में यह केवल एक प्रमाण है कि कितने शक्तिशाली वादे हैं।

यदि आप वादे पर कुछ और जानकारी चाहते हैं, तो मैंने हाल ही में Google+ Hangout के लिए उन पर (और कोड उदाहरण प्रदान किए) पर भरोसा किया, जहां मैंने AngularJS: AngularJS Hangout -- Promises, Promises Promises, Promises में किए गए फायदे, सामान्य उपयोग और सर्वोत्तम प्रथाओं को शामिल किया। कभी खत्म होने वाली वादे श्रृंखलाओं का विचार विशेष रूप से संबोधित नहीं किया गया था, हालांकि मेरे पास मेरे सिर के ऊपर से टाइमकोड नहीं है।

आशा है कि इससे मदद मिलती है!

+1

धन्यवाद! मैंने आपकी सलाह ली और 'स्कोप' फ़ंक्शन में अपना स्कोप वैरिएबल असाइन किया। सब कुछ वहां से चिकनी काम करता है। लेकिन मैं उत्सुक हूं कि ऐसे विशिष्ट मामले हैं जहां सीधे वादे को बांधने का अर्थ होता है ... चूंकि कोणीय इस कार्यक्षमता को प्रदान करता है। – sthomps

+0

मुझे ऐसे किसी भी मामले से अवगत नहीं है; मुझे लगता है कि कार्यक्षमता ज्यादातर सुविधा के लिए पेश की जाती है। लेकिन शायद किसी और की राय है ... –

+0

उत्तर देना "आप ऐसा नहीं करना चाहते" हमेशा सहायक नहीं होता है। मैं अपने मामले में निश्चित रूप से ऐसा करना चाहता हूं क्योंकि मैं डिबगिंग कर रहा हूं और मुझे नहीं पता कि वादे का मूल्य कैसे प्राप्त किया जाए। यह निश्चित रूप से किसी भी तरह से संभव होना चाहिए। – Machisuji

0

समझने में मुश्किल क्या है कि आप सोच सकते हैं कि अगर वादा अभी तक पूर्ण नहीं हुआ है तो हो सकता है कि अगर मैं थोड़ा इंतजार करूँ तो मैं फिर से जांच कर सकता हूं कि अब तक इसका मूल्य है या नहीं। लेकिन यह संभव नहीं है क्योंकि एमडीएन पर बताया गया है:

"जावास्क्रिप्ट इवेंट लूप के वर्तमान भाग को पूरा करने से पहले कॉलबैक कभी नहीं बुलाया जाएगा।"

तो जब तक आपका वर्तमान कार्य शुरू हो रहा है, वादा पूरी तरह से भरा नहीं जा सकता है। इवेंट लूप के वर्तमान भाग के दौरान इसका कोई "मूल्य" नहीं है। "वादा" का अर्थ है "मैं आपको अगली घटना-लूप रन के दौरान इसे देने का वादा करता हूं"।

आप उस वचन को वैश्विक चर के लिए सहेज सकते हैं और फिर जब कोई ब्राउज़र ब्राउज़र में किसी बटन पर क्लिक करता है तो एक नया ईवेंट-लूप आपके ईवेंट-हैंडलर को चलाकर शुरू होता है जो इस तरह के वादे पर "कब()" डाल सकता है कि अगर वादा उस समय हल हो जाता है तो नया जब-फ़ंक्शन मान लेता है तो यह तर्क के रूप में मिलता है और इसे एक चर में सहेजता है जिससे आप इसे पढ़ सकते हैं। यह कंसोल पर लिखने की जरूरत नहीं है, यह देखने के लिए कि यह वहां है।

यह मेरे लिए मुश्किल हिस्सा था, मैंने सोचा कि हाँ, मैं कंसोल पर वादा लिख ​​सकता हूं, लेकिन मैं कंसोल से नहीं पढ़ सकता, तो मैं अपने शेष कार्यक्रम में यह मूल्य कैसे प्राप्त कर सकता हूं? उत्तर: वर्तमान ईवेंट-लूप खत्म होने तक प्रतीक्षा करें, फिर आप कर सकते हैं।

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Using_promises

संबंधित मुद्दे