AngularJS:用異步數(shù)據(jù)初始化服務我有一個AngularJS服務,我想用一些異步數(shù)據(jù)初始化它。就像這樣: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();
}
};});很明顯,這是行不通的,因為如果有東西試圖調(diào)用doStuff()以前myData獲取返回,我將得到一個空指針異常。據(jù)我所知,從所問的其他問題中,我可以看出這里和這里我有幾個選擇,但沒有一個看起來很干凈(也許我遺漏了什么):帶有“Run”的安裝服務在設置我的應用程序時,請執(zhí)行以下操作: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();
}
};});這在某些情況下是可行的,但是如果異步數(shù)據(jù)碰巧花費的時間比初始化所用的時間更長,則當我調(diào)用時會得到一個空指針異常。doStuff()使用承諾對象這可能管用。唯一的缺點就是我在任何地方都調(diào)用MyService,我必須知道doStuff()返回一個承諾,所有的代碼都必須返回給我們。then與承諾互動。我寧愿等到我的數(shù)據(jù)回來后再加載我的應用程序。手動引導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
});});全局Javascript Var我可以將JSON直接發(fā)送到全局Javascript變量: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();
}
};});這也是可行的,但是我有一個全局javascript變量,它聞起來很難聞。這是我唯一的選擇嗎?這些選擇中有一個比其他的好嗎?我知道這是一個很長的問題,但我想表明,我已經(jīng)嘗試探索我的所有選擇。如有任何指導,將不勝感激。
AngularJS:用異步數(shù)據(jù)初始化服務
茅侃侃
2019-06-19 15:10:49