2013-08-28 3 views
5

У меня есть приложение, которое должно открыть всплывающее окно с запросом подтверждения у пользователя, затем сделать ajax cal и закрыть всплывающее окно.
Я попытался сделать это, используя цепочку обещание (я уже использовал его, и я помню, что он должен работать таким образом), но он, кажется, блокируется после вызова reservationService.confirm($scope.object);. Теперь это поддельный сервис, реализованный с setTimeout и $q, чтобы вернуть обещание (в будущем он сделает вызов ajax). Является ли это действительным кодом, или я не понял, как работает обещание?
Для всплывающего окна я выбираю AngularUI и код заключается в следующем:AngularJS bond chain

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

решаемые изменения setTimeout с $timeout углового служения

ответ

6

использовано $timeout вместо setTimeout потому что он работает на совмещены угловой объем, заставляя digest фазу (или использовать $scope.apply() внутри setTimeout).

2

Вы можете попробовать

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

Для цепочки затем последняя функция успеха или отказа должна вернуть обещание. Как $qdocumentation упоминает

затем (successCallback, errorCallback) - независимо от того, когда обещания было или будет разрешено или отклонено, а затем вызывает одну из успеха или обратных вызовов ошибок асинхронно как только результат доступен , Обратные вызовы вызывают с единственным аргументом: результат или отклонение причина.

Этот метод возвращает новое обещание, которое разрешено или отклонено с помощью возвращаемого значения successCallback или errorCallback.

+0

Таким образом, это работает, но так же работает 'bookService' ... – rascio

+0

Я не понимаю, что вы хотите сказать? – Chandermani

+0

Я редактировал сообщение ... посмотрите, есть ли реализация метода 'confirm'. Он реализуется так же, как и вы ... но почему я должен вызывать 'deferred.resolve', передавая в нем' обещание', возвращенное из службы, когда это решение из 'setTimeout'? – rascio