angularjs – promise nunca resolvida no controlador

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)