如何避免使用 $q 嵌套 promises

How to avoid nesting promises with $q

我正在尝试更多地投入到 promises 中,而不是投入到异步中。我有:

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);
});

我想我通过将 thencatch 分开来得到 findRepositoryPromise 部分。但我仍然嵌套了 getUserTeamsPromise。这似乎有点不对劲。有什么想法吗?

警告 - 我更熟悉 "promise" npm 模块中的 Promises 实现,但如果 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);
});

因为 promise 将接管其 then 回调的 return 值的状态 - 如果这是一个 promise,它可以如上所示链接。这也意味着如果 return $scope.getTeamRepositories($scope.selectedTeamId); 也是 return 承诺,其结果可以在另一个链式 .then 调用中检索。