Ich versuche eine Funktion zu schreiben, die ein Versprechen zurückgibt. Es gibt jedoch Situationen, in denen die angeforderten Informationen sofort verfügbar sind. Ich möchte es in ein Versprechen einwickeln, damit der Verbraucher keine Entscheidung treffen muss.
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});
}
}
Und benutze es so:
somethingService.getSomething(5).then(function(thing) {
alert(thing);
});
Das Problem ist, dass der Rückruf für das vorgelöste Versprechen nicht ausgeführt wird. Ist das eine legitime Sache? Gibt es einen besseren Weg, um mit dieser Situation umzugehen?
return $q.when(Cache[id])
. Auf jeden Fall sollte dies funktionieren und den Rückruf jedes Mal aufrufen, da Sie jedes Mal neue Versprechen erstellen.Antworten:
Kurze Antwort: Ja, Sie können ein AngularJS-Versprechen lösen, bevor Sie es zurücksenden, und es verhält sich wie erwartet.
Von JB Nizets Plunkr, aber überarbeitet , um im Kontext dessen zu arbeiten, was ursprünglich gefragt wurde (dh ein Funktionsaufruf zum Service) und tatsächlich vor Ort.
Innerhalb des Dienstes ...
Im Controller ....
Ich hoffe es hilft jemandem. Ich fand die anderen Antworten nicht sehr klar.
quelle
So geben Sie einfach ein vorgelöstes Versprechen in Angular 1.x zurück
Gelöstes Versprechen:
Abgelehntes Versprechen:
quelle
{resolved: $q.when, rejected: $q.reject}
So mache ich das normalerweise, wenn ich Daten in einem Array oder Objekt zwischenspeichern möchte
DEMO
quelle
Sie haben vergessen, das Cache-Element zu initialisieren
quelle
Cache
mit Versprechungen anstelle der beabsichtigten Objekte füllen und der Rückgabetyp für die Fälle, in denen sich ein Objekt im Cache befindet und wenn es nicht ist, wird nicht dasselbe sein. Das ist korrekter, denke ich:$http.get('/someUrl', {id: id}).then(function (response) { Cache[id] = response.data; return Cache[id]; });
Ich benutze gerne eine Fabrik, um die Daten von meiner Ressource zu erhalten.
Dann stellen Sie mein Modell hier wie folgt in den Dienst
Dann können meine Controller es einschließen und verfügbar machen oder das tun, was es für richtig hält, indem sie einfach auf den injizierten Service verweisen
Scheint in Ordnung zu funktionieren. Aber ich bin ein bisschen neu im Winkel. * Fehlerbehandlung aus Gründen der Übersichtlichkeit meistens weggelassen
quelle
getStuff
Methode verwendet das verzögerte