J'ai un AngularJS service que je veux initialiser avec certains de données asynchrone. Quelque chose comme ceci:
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();
}
};
});
Évidemment, cela ne marchera pas, parce que si quelque chose essaie de l'appeler doStuff()
avant myData
obtient en retour je reçois une exception de pointeur null. Aussi loin que je puisse dire à la lecture de certaines des autres questions posées ici et ici j'ai un peu d'options, mais aucune d'entre elles semblent très propre (peut-être que je suis absent quelque chose):
Le programme d'installation du Service avec "exécuter"
Lors de la configuration de mon application ce faire:
myApp.run(function ($http, MyService) {
$http.get('data.json').success(function (data) {
MyService.setData(data);
});
});
Puis mon service devrait ressembler à ceci:
myModule.service('MyService', function() {
var myData = null;
return {
setData: function (data) {
myData = data;
},
doStuff: function () {
return myData.getSomeData();
}
};
});
Cela fonctionne de temps en temps, mais si les données asynchrone arrive à prendre plus de temps qu'il en faut pour tout pour obtenir initialisé j'obtiens une exception de pointeur null lorsque j'appelle doStuff()
Utilisation promesse objets
Ce serait probablement travailler. Le seul inconvénient c'partout j'appelle MyService je vais avoir de savoir que doStuff() renvoie une promesse et tout le code sera à nous, then
d'interagir avec la promesse. Je préfère juste attendre jusqu'à ce myData est de retour avant le chargement du ma demande.
Manuel De Bootstrap
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
});
});
Mondial Javascript Var Je pourrais envoyer mon JSON directement global à une variable Javascript:
HTML:
<script type="text/javascript" src="data.js"></script>
data.js:
var dataForMyService = {
// myData here
};
Ensuite, il serait disponible lors de l'initialisation de MyService
:
myModule.service('MyService', function() {
var myData = dataForMyService;
return {
doStuff: function () {
return myData.getSomeData();
}
};
});
Ce serait trop de travail, mais ensuite, j'ai un javascript global variable qui sent mauvais.
Sont mes options? Sont une de ces options mieux que les autres? Je sais que c'est une bonne question, mais je voulais montrer que j'ai essayé d'explorer toutes mes options. De toute orientation serait très apprécié.