2014-01-22 68 views
3

我的控制器中有一個將用戶添加到組的功能,一旦用戶被分配到一個組,可用組的列表應該減少。我嘗試使用函數中的promise來控制流,但是基於控制檯日誌,我的所有groupServices都先運行,然後userServices在運行,防止可用組列表更新校正。承諾沒有按順序運行

控制器功能:

$scope.addUserToGroup = function(){ 
     var defer = $q.defer(); 
     defer.promise.then(function(){ 
      userService.addUserToGroup(
       $scope.selectedUser, 
       $scope.selectedAvailableGroups, 
       $scope.assignedGroups, 
       $scope.availableGroups, 
       $scope.groups 
      ); 
     }).then(compare()); 
     defer.resolve(); 
    }; 
    function compare(){ 
    console.log('comparing assigned with all '); 
     $scope.compareGroups = groupService.compareGroups();   
    } 

我使用的承諾設法使爲了在我的控制檯運行輸出而是根據一定的東西它似乎並不如此。

用戶服務功能

var addUserToGroup = function (selectedUser, selectedAvailableGroups, assignedGroups, availableGroups, groups){ 

    console.dir(selectedUser); 
    console.dir(selectedAvailableGroups); 
    console.dir(assignedGroups); 
    console.dir(availableGroups); 
    console.dir(groups); 

    var deferred = $q.defer(); 

    var addPromise = []; 
    var selectLength = selectedAvailableGroups.length; 

    //Add user to selected groups on server 
    deferred.promise 
     .then(function(){ 
     for (var i = 0; i < selectLength; i++){ 
      addPromise[i] = $().SPServices({ 
      operation: "AddUserToGroup", 
      groupName: selectedAvailableGroups[i].name, 
      userLoginName: selectedUser.domain 
      });  
     }; 
     }) 
     .then(function(){ 
      //when promise finished, push changes to availableGroups 
      for (var i = 0; i < selectLength; i++){ 
      assignedGroups.push(selectedAvailableGroups[i]); 
      console.log(selectedUser.name + " added to: " + selectedAvailableGroups[i].name); 
      }; 
     }); 
    //Run 
    deferred.resolve(); 
    } 

組服務功能:

var compareGroups = function() { 
    //Comparing assigned groups with allGroups to return available groups 
    var assignedGroupsIds = {}; 
    var groupsIds = {}; 
    var result = [] 
    availableGroups = []; 
    console.log('assigned'); 
    console.dir(assignedGroups); 
    console.log('avail'); 

    assignedGroups.forEach(function (el, i) { 
     assignedGroupsIds[el.id] = assignedGroups[i]; 
    }); 

    allGroups.forEach(function (el, i) { 
     groupsIds[el.id] = allGroups[i]; 
    }); 

    for (var i in groupsIds) { 
     if (!assignedGroupsIds.hasOwnProperty(i)) { 
      result.push(groupsIds[i]); 
      availableGroups.push(groupsIds[i]); 

     } 
    }; 
    console.dir(result); 
    console.dir(availableGroups); 
} 

控制檯登錄:

comparing assigned with all userCtrl.js:47 
assigned groups    groupServices.js:63 
Array[8]     groupServices.js:64 
available gruops   groupServices.js:65 
Array[3]     groupServices.js:82 
Array[3]     groupServices.js:83 
Object      userServices.js:38 
Array[1]     userServices.js:39 
Array[8]     userServices.js:40 
Array[4]     userServices.js:41 
Array[11]     userServices.js:42 
User added to: Test Group 4 userServices.js:64 

回答

5

您正在使用錯誤的方式承諾。

第一個問題是在這裏:

}).then(compare());

您嘗試註冊compare功能的執行結果作爲回調,而不是註冊只是compare功能是這樣的:

}).then(compare);

這就是爲什麼它首先執行,然後調用groupService.compareGroups(),並且只有在它完成後,您纔打電話給defer.resolve()和您的第一個註冊回調執行。這就是爲什麼你看到你當前的控制檯輸出。

您需要修改用戶服務及控制器在下列方式讓它正常工作(使用$q服務與承諾工作):

控制器功能:

function compare(){ 
    console.log('comparing assigned with all '); 
    $scope.compareGroups = groupService.compareGroups();   
} 

$scope.addUserToGroup = function(){ 
    userService.addUserToGroup(
     $scope.selectedUser, 
     $scope.selectedAvailableGroups, 
     $scope.assignedGroups, 
     $scope.availableGroups, 
     $scope.groups 
    ).then(compare); 
}; 

用戶服務功能:

(假設,$().SPServices返回Promise)

var addUserToGroup = function (selectedUser, selectedAvailableGroups, assignedGroups, availableGroups, groups){ 

    console.dir(selectedUser); 
    console.dir(selectedAvailableGroups); 
    console.dir(assignedGroups); 
    console.dir(availableGroups); 
    console.dir(groups); 

    var deferred = $q.defer(); 

    var addPromise = []; 
    var selectLength = selectedAvailableGroups.length; 

    //Add user to selected groups on server 
    for (var i = 0; i < selectLength; i++){ 
     addPromise[i] = $().SPServices({ 
      operation: "AddUserToGroup", 
      groupName: selectedAvailableGroups[i].name, 
      userLoginName: selectedUser.domain 
     });  
    } 

    $q.all(addPromise).then(function(){ 
     //when promise finished, push changes to availableGroups 
     for (var i = 0; i < selectLength; i++){ 
      assignedGroups.push(selectedAvailableGroups[i]); 
      console.log(selectedUser.name + " added to: " + selectedAvailableGroups[i].name); 
     }; 

     //Finish function 
     deferred.resolve(); 
    }); 
    return deferred.promise; 
} 
+0

嗨安德烈,我已經實現了你的改變,但現在整個事情比以前運行慢很多。另外,當比較運行並調整可用組時,現在它會返回正確的組數,但DOM不會更新以反映更改。 – Batman

+0

@Batman您使用的是哪個版本的AngularJs和Promises Api的實現?你能提供你實施的小提琴嗎? –

+0

我會把我的項目推到github上。應該給你一個完整的圖片。給我一秒鐘。 – Batman