2013-06-24 8 views
6

मार्क डगलगिश ने AngularJS विचारों में वादे का उपयोग करने के तरीके के बारे में nice little article लिखा था। कुछ लोगों ने टिप्पणियों में इस बारे में प्रश्न पूछे, लेकिन मार्क ने उन्हें जवाब नहीं दिया (अभी तक)। क्योंकि मैं मुझे एक ही सवाल पूछ रहा हूँ, मैं StackOverflow पर पूछने के बजाय उसका उत्तर मिल जाएगा:/संकेत "इंतज़ार कर" आप विचारों, में वादों का उपयोग करते हैंAngularJS दृश्यों में वादे का उपयोग

  1. मैं कैसे संभाल करते "लोड हो रहा" है, क्योंकि वे async हैं? क्या किसी वादे में "हल" या "भीतर की आवश्यकता" संपत्ति की तरह कुछ है?

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

धन्यवाद।

+0

केवल कोणीय आधिकारिक दस्तावेज़ों पर $ q के बारे में पढ़ें और आपके उपरोक्त दो प्रश्नों का उत्तर दिया जाएगा –

+2

ऐसा प्रतीत नहीं होता है कि #rtfm यहां सहायता करता है, क्योंकि मैं प्रोग्रामेटिक रूप से वादे का उपयोग नहीं करना चाहता हूं लेकिन जैसा कि वर्णन किया गया है प्रश्न/लेख में। यह दस्तावेज़ों का हिस्सा प्रतीत नहीं होता है। – Pipo

उत्तर

13

संपादित करें: कोणीय v1.2 resolution of promise in views is not activated by default के रूप में।

एक दृश्य में वादे का स्वचालित संकल्प पहले एक आसान उपकरण जैसा दिखता है लेकिन इसमें कई सीमाएं हैं जिन्हें सावधानीपूर्वक समझने और मूल्यांकन करने की आवश्यकता है। इस दृष्टिकोण के साथ सबसे बड़ा मुद्दा यह है कि यह एंगुलरजेएस है जो एक वादे में कॉलबैक जोड़ देगा और हमारे पास इसका बहुत कम नियंत्रण होगा।

अपने प्रश्नों का उत्तर देना:

1) के रूप में दर्शाया गया है, यह अंततः AngularJS तो हम ज्यादा नियंत्रण यहाँ नहीं है जो एक सफलता/त्रुटि कॉलबैक जोड़ देगा है। आप क्या कर सकते हैं मूल वादे को एक कस्टम में लपेटना है जो संकल्प को ट्रैक करेगा। लेकिन इस तरह के कुछ कुंजीस्ट्रोक को बचाने का पूरा उद्देश्य बेकार है। और नहीं, 'हल' जैसी कोई चीज नहीं है। संक्षेप में - प्रगति को ट्रैक करने के लिए कोई सार्वभौमिक तंत्र नहीं है जो सभी वादों के लिए काम करेगा। यदि आपके वादे $http-आधारित हैं, तो आप प्रगति पर अनुरोध को ट्रैक करने के लिए इंटरसेप्टर या pendingRequests संपत्ति का उपयोग कर सकते हैं।

2) आप नहीं कर सकते। एक बार फिर, यह AngularJS है जो $parse सेवा के अंदर एक हैंडलर जोड़ता है और ऐसा लगता है: promise.then(function(val) { promise.$$v = val; }); (कोड here देखें)। आप देख सकते हैं कि केवल एक सफलता कॉलबैक जोड़ा जाता है, इसलिए सभी विफलताओं को चुपचाप अनदेखा किया जा रहा है।

वे दृश्य में स्वचालित वादे समाधान की एकमात्र सीमाएं नहीं हैं। दूसरी समस्या यह है कि किसी फ़ंक्शन द्वारा दिए गए वादे सही ढंग से हल नहीं किए जाएंगे। उदाहरण के लिए, यदि आप ऐसा तरह एक उदाहरण के पुनर्लेखन करता है, तो होगा:

myModule.controller('HelloCtrl', function($scope, HelloWorld) { 

    $scope.messages = function() { 
    return HelloWorld.getMessages(); 
    } 
}); 

और निम्न मार्कअप इस्तेमाल करने की कोशिश:

<li ng-repeat="message in messages()"></li> 

चीज़ें अपेक्षित ढंग से काम करेगा, एक आश्चर्य के रूप में आ सकता है।

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

+0

आपके गहन उत्तर के लिए धन्यवाद। – Pipo

+2

"किसी फ़ंक्शन द्वारा लौटाए गए वादे सही ढंग से हल नहीं किए जाएंगे", लेकिन "चीजें अपेक्षित रूप से काम करेंगी" - क्या यह "नहीं" होना चाहिए? ;) – schellmax

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