Próbuję napisać funkcję, która zwraca obietnicę. Ale są chwile, kiedy żądane informacje są dostępne natychmiast. Chcę zawrzeć to w obietnicy, aby konsument nie musiał podejmować decyzji.
function getSomething(id) {
if (Cache[id]) {
var deferred = $q.defer();
deferred.resolve(Cache[id]); // <-- Can I do this?
return deferred.promise;
} else {
return $http.get('/someUrl', {id:id});
}
}
I użyj tego w ten sposób:
somethingService.getSomething(5).then(function(thing) {
alert(thing);
});
Problem polega na tym, że wywołanie zwrotne nie jest wykonywane dla wstępnie rozwiązanej obietnicy. Czy jest to uzasadnione? Czy jest lepszy sposób na rozwiązanie tej sytuacji?
return $q.when(Cache[id])
. W każdym razie powinno to działać i wywoływać oddzwonienie za każdym razem, ponieważ za każdym razem tworzysz nowe obietnice.Odpowiedzi:
Krótka odpowiedź: tak, możesz spełnić obietnicę AngularJS, zanim ją zwrócisz, i będzie ona działać zgodnie z oczekiwaniami.
Z Plunkr JB Nizeta, ale refaktoryzowany do pracy w kontekście tego, o co pierwotnie pytano (tj. Wywołanie funkcji do usługi) i faktycznie na miejscu.
Wewnątrz usługi ...
Wewnątrz kontrolera ...
Mam nadzieję, że to komuś pomoże. Pozostałe odpowiedzi nie były dla mnie zbyt jasne.
źródło
Jak po prostu zwrócić wstępnie rozwiązaną obietnicę w Angular 1.x
Rozwiązana obietnica:
Odrzucona obietnica:
źródło
{resolved: $q.when, rejected: $q.reject}
Oto, jak zwykle to robię, jeśli chcę faktycznie buforować dane w tablicy lub obiekcie
DEMO
źródło
Zapomniałeś zainicjować element Cache
źródło
Cache
obietnicami zamiast zamierzonych obiektów i typem zwracanym w przypadkach, gdy obiekt znajduje się w pamięci podręcznej, a gdy nie jest, nie będzie taki sam. To jest bardziej poprawne, myślę, że:$http.get('/someUrl', {id: id}).then(function (response) { Cache[id] = response.data; return Cache[id]; });
Lubię korzystać z fabryki, aby uzyskać dane z mojego zasobu na przykład.
Następnie wystaw mój model w serwisie takim jak ten tutaj
Wtedy moi kontrolerzy mogą go dołączyć i ujawnić lub zrobić to, co mu się podoba, jest to właściwe w jego kontekście, po prostu odwołując się do wstrzykniętej usługi.
Wydaje się działać dobrze. Ale jestem trochę nowy w kanciastym. * obsługa błędów przeważnie pomijana dla przejrzystości
źródło
getStuff
metoda polega na użyciu odroczonego antywzoru