如何避免用$q嵌套承诺

How to avoid nesting promises with $q

本文关键字:嵌套 承诺 何避免      更新时间:2023-09-26

我试图更多地进入承诺,而不是异步。我有:

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 模块中的 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);
});

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