Как избежать вложенных обещаний с $q
Я стараюсь больше выполнять обещания, а не асинхронно. Я имею:
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
часть вниз прямо, отделяя then
и catch
, Но у меня все еще есть getUserTeamsPromise
вложенный. Это кажется как-то не так. Есть идеи?
1 ответ
Решение
caveat - я больше знаком с реализацией Promises в модуле npm "promise", но если 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
вызов.