AngularJS verspricht nicht feuern, wenn sie von einem Dienst zurückgegeben werden [duplizieren]

8

Ich wickle einen langsamen WebSockets-Server in einen AngularJS-Dienst ein und rufe dann diesen Dienst von meinen Controllern aus an. Wenn ich Callbacks Callbacks auf Callbacks ketten, funktioniert alles gut, alle UI werden asynchron aktualisiert.

Wenn ich versuche, $q.defer() zu verwenden, um dieses Durcheinander von Rückrufen zu bereinigen, scheint es, dass mein Zurückgestelltes nie aufgerufen wird. Ich bin vertraut mit den Konzepten von Python's Twisted, also denke ich konzeptionell sollte alles funktionieren - aber es nicht.

Dies ist das kürzeste Beispiel, das ich mir vorstellen konnte, der langsame WebSockets-Server wird mit einer setTimeout-Funktion simuliert.

%Vor%

Das könnte wie folgt laufen:

  1. klicken Sie auf
  2. $ scope.button () wird aufgerufen; Es ruft die service.slow () - Funktion
  3. auf
  4. service.slow () gibt ein zurückgestelltes
  5. zurück
  6. Ein Rückruf ist auf dem zurückgestellten
  7. registriert
  8. verzögerte Brände, die den registrierten Rückruf auslösen (dieser Teil kommt nie vor)

Irgendwelche Ideen? Danke.

    
kmelva 25.01.2013, 19:52
quelle

1 Antwort

29

Sie müssen Ihren Callback mit $ apply aufrufen, da er außerhalb von Angular aufgerufen wird. Da dies ein Service ist, müssen Sie $ rootScope in Ihren Service aufnehmen:

%Vor%     
Manny D 25.01.2013, 21:01
quelle

Tags und Links