2013-08-28 19 views
5

Ich habe meine Anwendung, die ein Popup öffnen sollte fragen Sie eine Bestätigung an den Benutzer, dann ein Ajax Kal und schließen Sie das Popup.
Ich versuchte es mit einer Kette von Versprechen (Ich habe es bereits verwendet, und ich erinnere mich, dass es auf diese Weise funktionieren sollte), aber es scheint nach dem Aufruf an reservationService.confirm($scope.object); zu blockieren. Jetzt ist es ein gefälschter Dienst, der mit einem setTimeout und $q implementiert wurde, nur um ein Versprechen zurückzugeben (in Zukunft wird es den Ajax-Aufruf machen). Ist das ein gültiger Code oder ich habe nicht verstanden, wie vielversprechend funktioniert? diese
Für das Popup-I AngularUI und den Code zu wählen ist:AngularJS Versprechen Kette

reservationService.book($scope.object, day) 
     .then(function(){ 
      var dialogOpts = {/* dialog options omitted*/} 
      return $dialog.dialog(dialogOpts).open(); 

     }) 
     .then(function(result){ 
      console.log('confirmed? ', result); 
      if (result){ 
       //After this line it doesn't do nothing, also if the promise is resolved 
       return reservationService.confirm($scope.object); 
      } 
     }) 
     .then(function(){ 
      //this function is never executed 
      $scope.$emit('object:detail',{object: $scope.object}); 
     }); 

Voranmeldungs:

function confirm(){ 
    var deferred = $q.defer(); 
    setTimeout(function(){ 
      console.log('Confirming'); 
      deferred.resolve(true) 
    }, 500); 
    return deferred.promise; 
} 

Änderung GELÖST setTimeout mit $timeout Winkel Dienst

Antwort

6

$timeout anstelle von setTimeout ‚verwendet, weil es togheter am Winkel Umfang arbeitet, zwingt die digest Phase (oder im Innern der $scope.apply()setTimeout verwenden).

2

Können Sie

versuchen
//skipping the first then 
.then(function(result){ 
      var deferred = $q.defer(); 
      console.log('confirmed? ', result); 
      if (result){ 
       //After this line it doesn't do nothing, also if the promise is resolved 
       return deferred.resolve(reservationService.confirm($scope.object)); 
      } 
      deferred.resolve(); 
      return deferred.promise; 
     }) 
.then(function(){ 
       //this function is never executed 
       $scope.$emit('object:detail',{object: $scope.object}); 
      }); 

Für die Verkettung sollte dann die letzte Erfolgs- oder Fehlfunktion einen Versprechen abgeben. Da die $qdocumentation

erwähnt dann (successCallback, errorCallback) - unabhängig davon, wann das Versprechen wurde oder wird, dann nennt man Rückrufe für den Erfolg oder Fehler asynchron so schnell aufgelöst oder abgelehnt werden, da das Ergebnis verfügbar ist . Die Callbacks werden mit einem einzigen Argument aufgerufen: das Ergebnis oder die Ablehnung Grund.

Diese Methode gibt eine neue Zusage zurück, die über den Rückgabewert von successCallback oder errorCallback aufgelöst oder zurückgewiesen wird.

+0

Auf diese Weise funktioniert es, aber es ist genauso wie der 'reservationService' funktioniert ... – rascio

+0

Ich verstehe nicht, was Sie meinen zu sagen? – Chandermani

+0

Ich habe den Post bearbeitet ... schau mal da ist die Implementierung der 'confirm' Methode. Es ist auf die gleiche Weise implementiert, wie Sie es getan haben ... aber warum muss ich die 'deferred.resolve' aufrufen, indem ich das' Versprechen', das vom Dienst zurückgegeben wird, übergebe, wenn es von 'setTimeout' aufgelöst wird? – rascio