L'impostazione: Desidero disporre di un servizio che più controllori possano eseguire query per i dati estratti utilizzando $ http. La soluzione iniziale era usare le promesse come suggerito here.
Il problema: Ogni volta che un controller interroga il servizio, il servizio restituisce una promessa $ http, generando più query che estraggono gli stessi dati da un server remoto, più e più volte.
A Soluzione: la funzione di servizio restituisce dati o una promessa come di seguito. E spetta al controller controllare e agire di conseguenza.
app.factory('myService', function($http) {
var items = [];
var myService = {
getItems: function() {
// if items has content, return items; otherwise, return promise.
if (items.length > 0) {
return items;
} else {
var promise = $http.get('test.json').then(function (response) {
// fill up items with result, so next query just returns items.
for(var i=0;i<response.data.length;i++){
items.push(response.data[i]);
}
return items;
});
// Return the promise to the controller
return promise;
}
};
return myService;
});
Così, quando un controllore ha bisogno di tali dati, il controllore fa proprio qualcosa di simile:
app.controller('MainCtrl', function(myService,$scope) {
var promiseOrData = myService.async();
// Check whether result is a promise or data.
if (typeof promiseOrData.then === 'function'){
// It's a promise. Use then().
promiseOrData.then(function(data){
$scope.data = data;
});
} else {
// It's data.
$scope.data = data;
}
});
Quindi la domanda è: Esiste un modo migliore di fare questo? Con molti controller, questo metodo avrebbe un sacco di codice duplicato. Idealmente, i controllori interrogheranno direttamente il servizio per i dati direttamente.
Grazie!
Bel lavoro. Ancora meglio riduce la quantità di codice necessaria nel controller. –
Un modo per rendere questo più ASCIUTTO dal lato dei servizi? Ho diversi endpoint http che a voglio fare questo e ripetendo questo codice per ogni servizio/http endpoint sarebbe fuori mano –
@KyleKochis, l'unica cosa che sono stato in grado di fare è creare un singolo [intercettore HTTP] (http://stackoverflow.com/a/11957760/215945) per rilevare gli errori HTTP per tutti i miei servizi, quindi il codice precedente non ha più bisogno di un gestore degli errori. –