2013-08-28 42 views
5

Tôi có ứng dụng sẽ mở cửa sổ bật lên yêu cầu xác nhận tại người dùng, sau đó tạo một ajax cal và đóng cửa sổ bật lên.
Tôi đã cố gắng thực hiện bằng cách sử dụng một chuỗi lời hứa (Tôi đã sử dụng nó và tôi nhớ rằng nó sẽ hoạt động theo cách này), nhưng dường như chặn sau cuộc gọi đến reservationService.confirm($scope.object);. Bây giờ nó là một dịch vụ giả mạo được thực hiện với một setTimeout$q chỉ để trả lại một lời hứa (trong tương lai nó sẽ thực hiện cuộc gọi ajax). Đây có phải là mã hợp lệ hoặc tôi không hiểu cách hoạt động của lời hứa?
Đối popup tôi chọn AngularUI và mã là thế này:Chuỗi lời hứa 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 thay đổi setTimeout với $timeout góc của dịch vụ

Trả lời

6

Dùng $timeout thay vì setTimeout vì nó hoạt động togheter ở phạm vi góc, buộc các giai đoạn digest (hoặc sử dụng $scope.apply() bên trong setTimeout).

2

Bạn có thể thử

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

Để chuỗi sau đó, chức năng thành công hoặc thất bại cuối cùng sẽ trả về lời hứa. Khi $qdocumentation đề cập

sau đó (successCallback, errorCallback) - bất kể khi nào lời hứa đã hoặc sẽ được giải quyết hoặc từ chối, sau đó gọi một trong những thành công hay callbacks lỗi không đồng bộ trong thời gian sớm kết quả là có sẵn . Các cuộc gọi lại được gọi với một đối số duy nhất: kết quả hoặc từ chối lý do.

Phương thức này trả về lời hứa mới được giải quyết hoặc bị từ chối qua giá trị trả về của successCallback hoặc errorCallback.

+0

Bằng cách này nó hoạt động, nhưng nó cũng giống như cách hoạt động của 'reservationService' ... – rascio

+0

Tôi không hiểu ý bạn muốn nói gì? – Chandermani

+0

Tôi đã chỉnh sửa bài đăng ... nhìn ngay bây giờ có triển khai phương thức 'confirm'. Nó được thực hiện giống như cách bạn làm ... nhưng tại sao tôi phải gọi 'deferred.resolve' đi qua trong đó' lời hứa' được trả về từ dịch vụ, khi nó được giải quyết từ 'setTimeout'? – rascio

Các vấn đề liên quan