Как избежать вложенных обещаний с $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 вызов.

Другие вопросы по тегам