Ho creato un metodo un po 'complesso per restituire una risorsa tramite $ http.
Il metodo restituisce una promessa e quindi controlla la cache locale se le risorse esistono ancora. Se lo fa, restituirà le risorse memorizzate nella cache, altrimenti effettuerà la richiesta $ http. Funziona alla grande dopo che la risorsa è stata memorizzata nella cache, ma ho più funzioni tramite l'applicazione che sta premendo questo metodo al caricamento e ognuna di esse eseguirà la richiesta http perché le risorse non sono state ancora restituite e memorizzate nella cache.
Mi è venuto in mente un semplice controllo che corregge questo, ma sento che dovrebbe esserci un modo migliore. Ho aggiunto un valore booleano impostato su true se il metodo è nel mezzo di ottenere la risorsa e, in tal caso, risolvo il metodo con un timeout di mezzo secondo, per fornire il tempo di richiesta alla risoluzione. Il codice è sotto
Quindi, c'è un modo migliore?
var schools = [];
var loadingSchools = false;
function getAllSchools(forceUpdate) {
return $q(function (resolve, reject) {
if(loadingSchools) resolve($timeout(getAllSchools, 500));
else{
loadingSchools = true;
if (schools.length && !forceUpdate) {
loadingSchools = false;
resolve(schools);
return;
}
console.log('$http: Getting All Schools - schoolService.js');
$http.get(API_PATH + 'schools_GetAll', {cache:true})
.success(function(result) {
schools = result;
loadingSchools = false;
resolve(schools);
})
.error(function(error) {
schools = [];
loadingSchools = false;
reject(error);
});
}
});
}
forse creare una funzione che gestisce l'attesa promette in modo che, fondamentalmente, invece di impostare il timeout si registra a tale funzione e quando la promessa originale ritorna si risolve tutti quelli che hanno registrato – Saar
di gran lunga più semplici da usare nel router, specialmente se si utilizza 'ui-router'. Quale router stai usando? – charlietfl
@Saar - Pensavo bene, stavo considerando di fare qualcosa del genere, ma volevo fare questo post prima. Ho pensato che ci sarebbe stato un metodo per farlo incorporato in $ http che potevo sfruttare. – Kolby