非同期データで初期化したい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ポインタ例外が発生するため、これは明らかに機能しません。こことここで尋ねられた他のいくつかの質問を読んでわかる限り、私にはいくつかのオプションがありますが、どれも非常にきれいに見えません(おそらく私は何かを見逃しています):
「run」を使用したセットアップサービス
私のアプリを設定するときにこれを行います:
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()
promiseオブジェクトを使用する
これはおそらく機能します。MyServiceを呼び出すすべての場所での唯一の欠点は、doStuff()がPromiseを返し、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
});
});
グローバルJavaScript 変数JSONをグローバル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変数があります。
これらは私の唯一のオプションですか?これらのオプションの1つは他のオプションよりも優れていますか?これはかなり長い質問であることはわかっていますが、すべての選択肢を模索したことを示したいと思います。どんなガイダンスもいただければ幸いです。
$http
し、サービスにデータを保存してからアプリをブートストラップします。