No meu controlador eu estou recebendo uma promise de outro serviço. Eu adiciono uma cláusula ‘then’, mas o ‘then’ nunca é chamado.
Veja este plunker: http://plnkr.co/edit/dX0Oz1?p=preview ( versão javascript )
‘fakeLongRunningPromise’ cria uma promise que se resolve após 2 segundos.
No próprio controlador, envio uma nota para o console assim que a promise é resolvida.
Eu posso dizer que a promise está sendo resolvida porque “Resolving promise” é enviada para o console. Por que não sai a “promise resolvida”?
Pensando que talvez a promise esteja “fora do escopo” porque o controlador retorna?
O AngularJS o resultado da resolução de promises é propagado de forma assíncrona, dentro de um ciclo $ digest. Assim, os retornos de chamada registrados em then
serão chamados somente ao entrar no ciclo $ digest. O setTimeout
executado “fora do mundo AngularJS” e, como tal, não acionará retornos de chamada.
A solução é usar o Scope.$apply
ou o serviço $timeout
. Aqui está a versão com $ apply:
window.setTimeout(function() { console.log("Resolving promise"); $scope.$apply(function(){ deffered.resolve("worked"); }); }, 2000);
Aqui está um plunk fixo (JavaScript): http://plnkr.co/edit/g5AnUK6oq2OBz7q2MEh7?p=preview
Eu usei $timeout
vez de setTimeout
e funciona:
# Resolve the promise after 2 seconds $timeout( ()-> console.log "Resolving promise" deffered.resolve ("worked") , 2000)