2015-01-02 17 views
5

मेरी सेवा को एक मान को असीमित रूप से पुनर्प्राप्त करने की आवश्यकता है, लेकिन एक बार मेरे पास यह है, तो मैं मान के कैश किए गए संस्करण का उपयोग करना चाहता हूं।कोणीय सेवा कैश एक मान

जब दो नियंत्रक इस सेवा को कॉल करते हैं, तो मैं उम्मीद करता हूं कि पहले व्यक्ति को पुनर्प्राप्त मूल्य कैश करने के लिए और दूसरा कैश किए गए मान का उपयोग करने के लिए, लेकिन लॉग के अनुसार, मुझे कैश किए गए मान को कभी नहीं मिला। जब यह चलता है, तो मुझे एक लॉग संदेश दिखाई देता है जो दिखाता है कि मूल्य कैश किया जा रहा है, फिर, जब मैं एक अलग नियंत्रक के कोणीय मार्ग का पालन करता हूं, तो मुझे नहीं लगता कि सेवा कैश्ड मान पाती है। क्यों यह मेरी अपेक्षा के अनुसार नहीं चलती है ** **

angular.module('myApp.services').factory('Config', function() { 

    var Config = { }; 

    Config.currentYear = function() { 
     if (Config._currentYear) { 
      // sadly, we never execute here 
      console.log("returning cached year"); 
      return Parse.Promise.as(Config._currentYear); 
     } 
     return Parse.Config.get().then(function(config) { 
      console.log("caching year"); 
      Config._currentYear = config.get("currentYear"); 
      return Config._currentYear; 
     }); 
    }; 

    return Config; 

}); 

एक जोड़े नोट: (1) मैं कैश की गई विशेषता _currentYear नाम है, अंडरस्कोर समारोह नाम के साथ टकराने से बचने के लिए जोड़ने। यकीन नहीं है कि मुझे ऐसा करने की ज़रूरत है। (2) जब मूल्य कैश किया जाता है तो मैं एक पूर्ण वादा करता हूं, इसलिए फ़ंक्शन हमेशा एक वादा देता है ... यह भी सुनिश्चित नहीं है कि इसकी आवश्यकता है, लेकिन यह समझें कि इससे चोट नहीं पहुंची है।

+2

तो समस्या वास्तव में क्या है? – dfsq

+0

यह कोड के तहत सही प्रश्न में कहा गया था। मैंने प्रश्न भाग को कोड – user1272965

+0

से ऊपर ले जाया है अन्य समान प्रश्नों की जांच की? http://stackoverflow.com/questions/15100020/using-angular-service-to-share-data-between-controllers – ochi

उत्तर

3

डेटा कैशिंग करने के बजाय, आप केवल वादे को कैश क्यों नहीं करते और इसे वापस क्यों नहीं करते हैं। जब आप डेटा को कैश करते हैं, तो आप केवल सफलता कॉलबैक के भीतर डेटा Config._currentYear सेट कर रहे हैं और संभावना है कि सफल कॉलबैक चलाने से पहले अन्य बाद के कॉल हो रहे हैं। तो आप एक ही कॉल फिर से बनाते हैं। आप आसानी से यह देख सकते हैं जब आपके पास एक ही टेम्पलेट पर मौजूद होने वाले विभिन्न नियंत्रकों से उसी सेवा विधि में किए गए कॉल होते हैं। एक वादे को आगे बढ़ाकर इन मुद्दों से बचेंगी।

angular.module('myApp.services').factory('Config', function() { 
    var config; //Just use to save the promise 
    Config.currentYear = function() { 
     /*If there is already a call made before return the promise else 
      make the actual call and store the promise in the variable.*/ 
     return config || config = Parse.Config.get().then(function(config) { 
      return config.get("currentYear"); 
     }); 
    }; 
}); 
+2

1) उत्तर के लिए धन्यवाद, 2) दौड़ की स्थिति से बचने के वादे को कैश करने का अच्छा विचार (मैं इसे अन्य स्थानों में भी उपयोग करने जा रहा हूं), 3) मैंने अभी पाया है कि मेरी समस्या एडोब ब्रैकेट्स नोडजेस के साथ करना है सर्वर (जब मैं मैन्युअल रूप से भाग गया, तो यह काम करता था), लेकिन मैं इसके सहायक के बाद इस सही को चिह्नित करने जा रहा हूं (और प्रश्न में प्रश्न चिह्न रखने के बारे में pedantic नहीं)। – user1272965

+0

@ user1272965 आपका स्वागत है। खुशी है कि यह कुछ मदद की थी। एक और चीज जो आप जोड़ सकते हैं वह कैच ब्लॉक में कैश किए गए वादे को खत्म करना है। बस इतना है कि आप हमेशा कैश में असफल वादे नहीं रखते हैं। और हां, वादा को कैश करने से कोड की रेखा की संख्या कम हो जाती है, जो डेटा को कैश करते समय आपको अन्यथा करना पड़ता है, सभी वादे डेटा के लिए सिर्फ प्रॉक्सी है। – PSL

+0

@ user1272965 मुझे खेद है यदि आपको लगता है कि मैं (और अन्य) पैडेंटिक हैं। यह आपके लिए ऐसा प्रतीत हो सकता है, लेकिन यह केवल इसलिए है क्योंकि हमने कई अनुभव किए हैं जब लोगों ने स्पष्ट रूप से यह नहीं पूछा कि उनकी समस्या क्या है और लोग ऐसी समस्या को हल करने के लिए समय (बेकार) समय व्यतीत करते हैं जो अस्तित्व में नहीं था। तो यहाँ _very_ स्पष्ट होने की उम्मीद है और मुझे उम्मीद है कि आप एसओ समुदाय के खिलाफ पक्षपात नहीं करेंगे। लेकिन मुझे खुशी है कि पीएसएल ने यह भी सोचा कि दौड़ की स्थिति समस्या का मूल है :) – dirkk

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