2015-01-02 22 views
0

我正試圖讓更多的承諾和更少的異步。我有:

var findRepositoryPromise, getUserTeamsPromise; 

getUserTeamsPromise = null; 

findRepositoryPromise = RepositoryService.find($stateParams.host, $stateParams.owner, $stateParams.repository); 

findRepositoryPromise.then(function(response) { 
    $scope.selectedRepository = response.repository; 
    getUserTeamsPromise = TeamService.getUserTeams($rootScope.user.id); 
    return getUserTeamsPromise.then(function(response) { 
    $scope.teams = response.teams; 
    $scope.selectedTeam = $scope.teams[0]; 
    $scope.selectedTeamId = $scope.selectedTeam.id; 
    return $scope.getTeamRepositories($scope.selectedTeamId); 
    }); 
}); 

findRepositoryPromise.catch(function(error) { 
    return toaster.pop('error', 'Error', error); 
}); 

我覺得我有findRepositoryPromise部分降權,通過分離thencatch。但我仍然有嵌套的getUserTeamsPromise。這似乎有些不妥。有任何想法嗎?

回答

2

警告 - 我比較熟悉的「承諾」新公共管理模塊中的承諾的實現,但如果Q以同樣的方式,你可以這樣做:

var findRepositoryPromise; 

findRepositoryPromise = RepositoryService.find($stateParams.host, $stateParams.owner, $stateParams.repository); 

findRepositoryPromise.then(function(response) { 
     $scope.selectedRepository = response.repository; 
     return TeamService.getUserTeams($rootScope.user.id); 
}).then(function(response) { 
    $scope.teams = response.teams; 
    $scope.selectedTeam = $scope.teams[0]; 
    $scope.selectedTeamId = $scope.selectedTeam.id; 
    return $scope.getTeamRepositories($scope.selectedTeamId); 
}); 

findRepositoryPromise.catch(function(error) { 
    return toaster.pop('error', 'Error', error); 
}); 

由於前景將接管狀態的回調價值 - 如果這是一個承諾,它可以如上所示鏈接。這也意味着如果return $scope.getTeamRepositories($scope.selectedTeamId);也返回一個承諾,其結果可以在另一個鏈接.then調用中檢索。