angularjs - Versprechen wurde nie im Controller gelöst

8

In meinem Controller bekomme ich ein Versprechen von einem anderen Dienst. Ich füge eine "then" -Klausel hinzu, aber das "then" wird nie aufgerufen.

Sieh diesen Plünderer: Ссылка ( JavaScript-Version )

'fakeLongRunningPromise' erstellt ein Versprechen, das sich nach 2 Sekunden selbst löst.

Im Controller selbst sende ich eine Notiz an die Konsole, sobald das Versprechen gelöst ist.

Ich kann sagen, dass das Versprechen gelöst wurde, weil "Versprechen lösen" an die Konsole ausgegeben wurde. Warum gibt es "Versprechen gelöst" nicht aus?

Denken Sie vielleicht, dass das Versprechen "außerhalb des Geltungsbereichs" liegt, weil der Controller zurückkehrt?

    
Roy Truelove 09.01.2013, 21:04
quelle

2 Antworten

12

Das AngularJS, das Ergebnis der Versprechungsauflösung, wird asynchron innerhalb eines $ Digest-Zyklus propagiert. Die Callbacks, die mit then registriert wurden, werden also erst beim Eintritt in den $ Digest-Zyklus aufgerufen. Das setTimeout wird "außerhalb der AngularJS-Welt" ausgeführt und löst daher keine Callbacks aus.

Die Lösung besteht darin, Scope.$apply oder den $timeout -Dienst zu verwenden. Hier ist die Version mit $ apply:

%Vor%

Hier ist ein fester Plunk (JavaScript): Ссылка

    
pkozlowski.opensource 09.01.2013, 21:32
quelle
2

Ich habe $timeout anstelle von setTimeout verwendet und es funktioniert:

%Vor%     
asgoth 09.01.2013 21:37
quelle

Tags und Links