我嘗試使用承諾並在角度應用中承擔攻擊。鏈接承諾,並在角度應用中用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;
}
我乾淨的代碼只保留//保存在中頻部分,但有一個else條件更新如果對象質疑和鍛鍊已經創建。 – Gab
毫無疑問,只要在for循環中調用'deferred.resolve(newquestion)',promise就會被解析並調用'saveExerciseApi',當然如果還有更多的'checkQuestions'函數結束之前'$ scope.formQuestion'中的元素 – remigio