2013-11-22 83 views
0

我嘗試使用承諾並在角度應用中承擔攻擊。鏈接承諾,並在角度應用中用for循環承諾

我使用$scope.checkQuestions()$scope.saveExerciseApi() 這兩個函數,但問題在於第二個函數在第一個函數完成之前啓動,這並不是我所期望的。

第一個調用承諾更新每個問題(使用REST服務) ,然後更新$scope.formQuestion[]數組,用於頁面上的表單。

$scope.Questions$scope.Exercises已經是承諾對象在REST服務中更新和創建實體。

$scope.formQuestion,$scope.formexercise,$scope.exercises是在網頁上使用的數據。

$scope.checkQuestions = function(){ 
deferred = $q.defer() 
for (i in $scope.formQuestion){ 
    if ($scope.formQuestion[i].pk == null){  //Save 
     $scope.Questions.add($scope.formQuestion[i]).then(function(newquestion){ 
      deferred.resolve(newquestion); 
      $scope.formQuestion[i] = newquestion; 
      }); 
     }  
    } 
return deferred.promise; 
} 

$scope.saveExerciseApi = function() { 
    if ($scope.formexercise.pk == null){  //Save 
     $scope.Exercises.add($scope.formexercise).then(function(newexercise){ 
      $scope.exercises.push(newexercise); 
      $scope.showform = false; 
      }); 
     } 
} 

$scope.saveExercise = function() { 
    $scope.checkQuestions().then($scope.saveExerciseApi); 
} 

編輯:

以下變化不會解決問題。

1)$scope.formexercise.questions仍然是空的,

2)$ scope.saveExerciseApi推出從未發生

這有什麼錯在下面的邏輯?是否有更好更乾淨的方式來循環並更新questions的本地數據並更新exercise數據?

$scope.checkQuestions = function(){ 
    deferred = $q.defer() 
    $scope.formexercise.questions = Array(); 
    for (i in $scope.formQuestion){     
      if ($scope.formQuestion[i].pk == null){ 
      $scope.Questions.add($scope.formQuestion[i]).then(function(newquestion){ 
       $scope.formQuestion[i] = newquestion; 
       $scope.formexercise.questions.push($scope.formQuestion[i].pk); 
       if ($scope.formQuestion.length == i+1){ 
       deferred.resolve(newquestion); 
       } 
      }); 
      } else { 
      $scope.Questions.edit($scope.formQuestion[i].pk, $scope.formQuestion[i]).then(function(updatequestion){ 
      $scope.formexercise.questions.push($scope.formQuestion[i].pk); 
      if ($scope.formQuestion.length == i+1){ 
       deferred.resolve(udpatequestion); 
      } 
     }); 
     } 
     } 
return deferred.promise; 
} 
+0

我乾淨的代碼只保留//保存在中頻部分,但有一個else條件更新如果對象質疑和鍛鍊已經創建。 – Gab

+0

毫無疑問,只要在for循環中調用'deferred.resolve(newquestion)',promise就會被解析並調用'saveExerciseApi',當然如果還有更多的'checkQuestions'函數結束之前'$ scope.formQuestion'中的元素 – remigio

回答

2

解析方法在第一個問題被保存後立即被調用。該解決方法應該被稱爲添加所有新的問題後,我相信

$scope.checkQuestions = function(){ 
deferred = $q.defer() 
var questionsToSave=0; 
for (i in $scope.formQuestion){ 
    if ($scope.formQuestion[i].pk == null){  //Save 
     int questionsToSave=questionsToSave + 1; 
     $scope.Questions.add($scope.formQuestion[i]).then(function(newquestion){ 
      $scope.formQuestion[i] = newquestion; 
      if(questionsToSave<=1) 
       deferred.resolve(newquestion); 
      else 
       questionsToSave=questionsToSave-1; 
      }); 
     }  
    } 
return deferred.promise; 
}