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