Zbudowałem nieco skomplikowaną metodę zwracania zasobów za pomocą $ http.
Metoda zwraca obietnicę, a następnie sprawdza moją lokalną pamięć podręczną, jeśli zasoby jeszcze istnieją. Jeśli to zrobi, zwróci buforowane zasoby, jeśli nie, wykona żądanie $ http. Działa to świetnie po buforowaniu zasobu, ale mam wiele funkcji za pośrednictwem aplikacji, która uderza w tę metodę podczas ładowania, a każda z nich wykona żądanie http, ponieważ zasoby nie zostały jeszcze zwrócone i zapisane w pamięci podręcznej.
Wpadłem na prosty test, który to rozwiązuje, ale wydaje mi się, że powinien istnieć lepszy sposób. Dodałem wartość logiczną, która jest ustawiona na wartość true, jeśli metoda znajduje się w trakcie pobierania zasobu, a jeśli tak, to rozwiązuję tę metodę z półsekundowym limitem czasu, aby dać czas żądania do rozwiązania. Kod znajduje się poniżej.
Czy istnieje lepszy sposób?
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);
});
}
});
}
może utworzyć funkcję, która zarządza oczekiwania obiecuje więc w zasadzie zamiast ustawiania limitu czasu się zarejestrować do tej funkcji, a gdy oryginał obietnica zwraca rozwiązać wszystkie te, które zarejestrowały – Saar
znacznie łatwiej użyć rozwiązania w routerze, szczególnie jeśli używa się 'ui-routera '. Z jakiego routera korzystasz? – charlietfl
@Saar - Dobre myślenie, rozważałem zrobienie czegoś takiego, ale chciałem zrobić ten post pierwszy. Pomyślałem, że istnieje metoda na to, wbudowany w $ http, który mógłbym wykorzystać. – Kolby