2013-08-28 196 views
5

我有我的應用程序應該打開一個彈出式窗口請求在用戶確認,然後使ajax cal並關閉彈出窗口。
我試圖使用承諾(我已經使用它,並且我記得它應該以這種方式工作)的鏈,但它似乎阻止在reservationService.confirm($scope.object);的呼叫之後。現在這是一個虛假的服務,實現了setTimeout$q只是爲了回報一個承諾(將來它會做ajax調用)。這是一個有效的代碼,或者我沒有否認承諾的工作原理?
對於我選擇AngularUI和代碼的彈出是這樣的: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; 
} 

解決 變化setTimeout$timeout角度的服務

回答

6

用於$timeout代替setTimeout「原因它工作togheter在角範圍,迫使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

以這種方式,它的工作方式,但它是以同樣的方式'reservationService'工作... – rascio

+0

我不明白你的意思說什麼? – Chandermani

+0

我正在編輯帖子......看看現在有'confirm'方法的實現。它的實現方式與你所做的一樣...但是爲什麼我必須調用'deferred.resolve'傳入從服務返回的'promise',當它從'setTimeout'中解析? – rascio