2013-08-28 15 views
5

Mam swoją aplikację, która powinna otworzyć wyskakujące okienko z prośbą o potwierdzenie użytkownika, a następnie zrób kalkę ajax i zamknij okienko.
Próbowałem to zrobić przy użyciu łańcucha obietnicy (już go użyłem i pamiętam, że powinno działać w ten sposób), ale wydaje się, że blokuje po wywołaniu do reservationService.confirm($scope.object);. Teraz jest to fałszywa usługa zaimplementowana z setTimeout i $q tylko po to, aby zwrócić obietnicę (w przyszłości wywoła ajax). Czy to jest prawidłowy kod, czy nie zniszczyłem tego, jak działa obietnica?
Dla popup wybiorę AngularUI i kod to:Łańcuch obiegu AngularJS

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}); 
     }); 

reservationService:

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

SOLVED zmianę setTimeout z $timeout kątowe służba

Odpowiedz

6

Używane $timeout zamiast setTimeout bo to działa wspolnie w zakresie kątowym, zmuszając fazę digest (lub użyć $scope.apply() wewnątrz setTimeout).

2

można spróbować

//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}); 
      }); 

W przypadku łączenia, ostatnia funkcja powodzenia lub niepowodzenia powinna zwrócić obietnicę. Jak $qdocumentation wspomina

wówczas (successCallback, errorCallback) - niezależnie od tego, kiedy obietnica był lub zostaną rozwiązane lub odrzucone, a następnie zwraca jeden z sukcesu lub callbacków błędach asynchronicznie jak tylko wynik jest dostępny . Połączenia zwrotne są wywoływane z jednym argumentem: powodem lub odrzuceniem.

Ta metoda zwraca nową obietnicę, która została rozstrzygnięta lub odrzucona przez wartość zwracaną successCallback lub errorCallback.

+0

W ten sposób działa, ale działa tak samo jak "reservationService" ... – rascio

+0

Nie rozumiem, co masz na myśli? – Chandermani

+0

Edytowałem post ... spójrz, teraz jest implementacja metody 'confirm'. Jest on zaimplementowany w taki sam sposób jak ty ... ale dlaczego muszę wywołać 'deferred.resolve' przekazując w nim' obietnicę' zwróconą z usługi, gdy jest to rozstrzygnięcie z 'setTimeout'? – rascio