Estou tentando escrever uma função que retorna uma promessa. Mas há momentos em que as informações solicitadas estão disponíveis imediatamente. Quero cumpri-lo com uma promessa para que o consumidor não precise tomar uma decisão.
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});
}
}
E use-o assim:
somethingService.getSomething(5).then(function(thing) {
alert(thing);
});
O problema é que o retorno de chamada não é executado para a promessa pré-resolvida. Isso é uma coisa legítima a se fazer? Existe uma maneira melhor de lidar com esta situação?
return $q.when(Cache[id])
. De qualquer forma, isso deve funcionar e chamar o retorno de chamada sempre que você estiver criando novas promessas a cada vez.Respostas:
Resposta curta: Sim, você pode resolver uma promessa do AngularJS antes de devolvê-la e ela se comportará conforme o esperado.
Do Plunkr de JB Nizet mas refatorado para trabalhar dentro do contexto do que foi originalmente solicitado (ou seja, uma chamada de função para serviço) e realmente no local.
Dentro do serviço ...
Dentro do controlador ....
Eu espero que isso ajude alguém. Não achei as outras respostas muito claras.
fonte
Como simplesmente retornar uma promessa pré-resolvida no Angular 1.x
Promessa resolvida:
Promessa rejeitada:
fonte
{resolved: $q.when, rejected: $q.reject}
Aqui está como eu normalmente faço se realmente quero armazenar dados em cache na matriz ou objeto
DEMO
fonte
Você esqueceu de inicializar o elemento Cache
fonte
Cache
promessas com, em vez dos objetos pretendidos, e o tipo de retorno para os casos em que um objeto estiver no cache e quando não estiver, não será o mesmo. Isso é mais correto, eu acho:$http.get('/someUrl', {id: id}).then(function (response) { Cache[id] = response.data; return Cache[id]; });
Eu gosto de usar uma fábrica para obter os dados dos meus recursos, algo assim.
Em seguida, exponha meu modelo no serviço como este aqui
Em seguida, meus controladores podem incluí-lo e expô-lo ou fazer o que julga correto em seu contexto simplesmente fazendo referência ao Serviço injetado.
Parece funcionar bem. Mas eu sou meio novo em angular. * tratamento de erros principalmente deixado de fora para maior clareza
fonte
getStuff
método é usando o antipattern diferido