angularjs – promesa nunca resuelta en el controlador

En mi controlador recibo una promesa de otro servicio. Le agrego una cláusula ‘then’, pero nunca se llama ‘then’.

Vea este plunker: http://plnkr.co/edit/dX0Oz1?p=preview ( versión de javascript )

‘fakeLongRunningPromise’ crea una promesa que se resuelve después de 2 segundos.

En el controlador mismo, envío una nota a la consola una vez que se ha resuelto la promesa.

Puedo decir que la promesa se está resolviendo porque “Resolving promise” se envió a la consola. ¿Por qué no genera “promesa resuelta”?

¿Pensando que tal vez la promesa está “fuera de scope” porque el controlador regresa?

El AngularJS el resultado de la resolución de promesas se propaga de forma asíncrona, dentro de un ciclo $ digest. Por lo tanto, las devoluciones de llamada registradas en then solo se solicitarán al ingresar al ciclo $ digest. El setTimeout ejecuta “fuera del mundo AngularJS” y, como tal, no activará las devoluciones de llamada.

La solución es usar Scope.$apply o el $timeout service. Aquí está la versión con $ apply:

  window.setTimeout(function() { console.log("Resolving promise"); $scope.$apply(function(){ deffered.resolve("worked"); }); }, 2000); 

Aquí hay un plunk fijo (JavaScript): http://plnkr.co/edit/g5AnUK6oq2OBz7q2MEh7?p=preview

He usado $timeout lugar de setTimeout y funciona:

  # Resolve the promise after 2 seconds $timeout( ()-> console.log "Resolving promise" deffered.resolve ("worked") , 2000)