我有一个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()返回了promise,所有代码都必须交给我们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
});
});
全局Java语言Var 我可以将JSON直接发送到全局Java语言变量:
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变量,它闻起来不好。
这些是我唯一的选择吗?这些选择之一是否比其他选择更好?我知道这是一个很长的问题,但我想表明我已尝试探索所有选择。任何指导将不胜感激。
$http
,然后将数据保存在服务中,然后引导应用程序。