如何避免使用 $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);
});
我想我通过将 then
和 catch
分开来得到 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
调用中检索。
我正在尝试更多地投入到 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);
});
我想我通过将 then
和 catch
分开来得到 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
调用中检索。