비동기 데이터로 초기화하려는 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()오기 전에 전화를 걸면 myDatanull 포인터 예외가 발생 하기 때문에 분명히 작동하지 않습니다 . 여기 와 여기에 묻는 다른 질문 중 일부를 읽을 수 있는 한 몇 가지 옵션이 있지만 그중 어느 것도 매우 깨끗한 것처럼 보이지 않습니다 (아마도 뭔가 빠진 것 같습니다).
"실행"설정 서비스
내 앱을 설정할 때 다음을 수행하십시오.
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();
}
};
});
이것은 약간의 시간 동안 작동하지만 모든 것이 초기화되는 데 걸리는 시간보다 비동기 데이터가 오래 걸리면 호출 할 때 null 포인터 예외가 발생합니다. 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
});
});
전역 자바 스크립트 Var 내 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다음 서비스에 데이터를 저장 한 다음 앱을 부트 스트랩합니다.