2015-06-29 57 views
1

我有一個頁面上的按鈕,調用控制器內的過程函數,但在我發佈細節之前,我需要獲取 用戶詳細信息和userGroup詳細信息,並最終發佈用戶詳細信息。AngularJs如何確保代碼同步執行

但是,當我調試這個我可以看到我的populateUserGroups函數被調用,但沒有得到詳細信息的updateUser函數被調用,因此發佈的數據沒有userGroup數據。

看來populateUserGroups功能異步調用,我怎麼能確保當用戶點擊Process按鈕,第一的getData被調用,然後 populateUserGroups被稱爲和$ scope.user.userGroups填充用返回的數據最後updateUser被調用?

$scope.process = function() { 
     myservice.getData($scope.userId).success(function (data) { 

       $scope.user = data.value; 
       $scope.user.userGroups = {}; 

       $scope.populateUserGroups(); 
       $scope.updateUser(); 

     }); 
    }; 

    $scope.populateUserGroups = function() { 
     myservice.getUserGroups($scope.userId).success(function (groupData) { 
      $scope.user.userGroups = groupData; 
     }); 
    }; 

    $scope.updateUser = function() { 
     myservice.updateUser($scope.user).success(function() { 

      // do stuff 

     }); 
    }; 
+0

調用第一功能的回調的第二個功能? – JJJ

+1

使用承諾理想地返回承諾的服務。請參閱$ q – Sam

+0

使用異步,https://www.npmjs.com/package/async –

回答

1

使用$ q.all

$q.all([ 
    myservice.getData($scope.userId), 
    myservice.getUserGroups($scope.userId) 
]).then(function(resps){ 
    $scope.user = resps[0].value; 
    $scope.user.userGroups = resps[1].data; 

    $scope.populateUserGroups(); 
    $scope.updateUser(); 
})