मेरे पास एक AngularJS सेवा है जिसे मैं कुछ अतुल्यकालिक डेटा के साथ आरंभ करना चाहता हूं। कुछ इस तरह:
myModule.service('MyService', function($http) {
var myData = null;
$http.get('data.json').success(function (data) {
myData = data;
});
return {
setData: function (data) {
myData = data;
},
doStuff: function () {
return myData.getSomeData();
}
};
});
जाहिर है यह काम नहीं करेगा क्योंकि अगर कुछ वापस आने doStuff()
से पहले कॉल करने की कोशिश करता है तो myData
मुझे एक शून्य सूचक अपवाद मिलेगा। जहां तक मैं यहां पूछे गए कुछ अन्य प्रश्नों को पढ़ने से बता सकता हूं और यहां मेरे पास कुछ विकल्प हैं, लेकिन उनमें से कोई भी बहुत साफ नहीं लगता है (शायद मुझे कुछ याद आ रहा है):
"रन" के साथ सेटअप सेवा
मेरा ऐप सेट करते समय ऐसा करें:
myApp.run(function ($http, MyService) {
$http.get('data.json').success(function (data) {
MyService.setData(data);
});
});
तब मेरी सेवा इस तरह दिखाई देगी:
myModule.service('MyService', function() {
var myData = null;
return {
setData: function (data) {
myData = data;
},
doStuff: function () {
return myData.getSomeData();
}
};
});
यह कुछ समय के लिए काम करता है लेकिन अगर एसिंक्रोनस डेटा को होने में अधिक समय लगता है तो इसे शुरू करने के लिए मुझे सब कुछ लेना पड़ता है जब मैं कॉल करता हूं तो मुझे एक शून्य सूचक अपवाद मिलता है doStuff()
वादा वस्तुओं का उपयोग करें
यह शायद काम करेगा। केवल हर जगह यह उल्टा है कि मैं MyService को कॉल करता हूं मुझे यह जानना होगा कि doStuff () एक वादा वापस करता है और सभी कोड को then
वादे के साथ बातचीत करने के लिए हमें करना होगा । मैं बजाय अपने आवेदन लोड करने से पहले myData वापस आने तक इंतजार करना होगा।
मैनुअल बूटस्ट्रैप
angular.element(document).ready(function() {
$.getJSON("data.json", function (data) {
// can't initialize the data here because the service doesn't exist yet
angular.bootstrap(document);
// too late to initialize here because something may have already
// tried to call doStuff() and would have got a null pointer exception
});
});
वैश्विक जावास्क्रिप्ट वार I अपने JSON को सीधे एक वैश्विक जावास्क्रिप्ट चर में भेज सकता है:
HTML:
<script type="text/javascript" src="data.js"></script>
data.js:
var dataForMyService = {
// myData here
};
तब यह तब उपलब्ध होगा जब आरंभीकरण MyService
:
myModule.service('MyService', function() {
var myData = dataForMyService;
return {
doStuff: function () {
return myData.getSomeData();
}
};
});
यह भी काम करेगा, लेकिन फिर मेरे पास एक वैश्विक जावास्क्रिप्ट वैरिएबल है जिसमें बदबू आती है।
क्या ये मेरे एकमात्र विकल्प हैं? क्या इन विकल्पों में से एक दूसरों की तुलना में बेहतर है? मुझे पता है कि यह एक बहुत लंबा सवाल है, लेकिन मैं यह दिखाना चाहता था कि मैंने अपने सभी विकल्पों का पता लगाने की कोशिश की है। किसी भी मार्गदर्शन की बहुत सराहना की जाएगी।
$http
, फिर एक सेवा में डेटा को सहेजता है, फिर एक ऐप को बूटस्ट्रैप करता है।