有没有一种方法可以等待 angular-ui-router resolve 中多个 promise 的结果?
Is there a way I can wait for the outcome of multiple promises in an angular-ui-router resolve?
目前我的代码是这样的:
resolve: {
adminTestLevel: ['testService', (tes: ITestService) => {
return tes.getAdminTestLevel();
}],
adminTestStatus: ['testService', (tes: ITestService) => {
return tes.getAdminTestStatus();
}],
adminTestType: ['testService', (tes: ITestService) => {
return tes.getAdminTestType();
}],
adminTestGradeType: ['testService', (tes: ITestService) => {
return tes.getAdminTestGradeType()
}],
exams: ['testService', (tes: ITestService) => {
return tes.getExams();
}],
examTypes: ['testService', (tes: ITestService) => {
return tes.getExamTypes();
}],
testOrderBy: ['testService', (tes: ITestService) => {
return tes.getTestOrderBy();
}],
topics: ['testService', (tes: ITestService) => {
return tes.getTestsTopics();
}],
},
有没有一种方法可以简化它,这样我就不必对 ITestService 进行如此多的注入?此外,我不需要拥有所有不同的解决方案,如果可能的话,我想将它们合二为一。
您可以使用$q.all
resolve: {
myDate: function($q, tes) {
return $q.all([tes.getAdminTestLevel(), ... , tes.getTestsTopics()]);
}
}
myData
只会在数组中的所有 promise 都 resolve 之后才 resolve
$q.all
会给你一组结果,你可以在你的控制器中使用,你可以通过索引访问它们,所以它比普通注入更不方便。
你可以尝试使用 $q.all(promises)
来自 ($q) 的文档:
$q.all(promises);
Combines multiple promises into a single promise that is resolved when all of the input promises are resolved.
所以你可以将多个承诺组合成一个承诺数组并等待解决。您的代码可能如下所示:
resolve: {
required_data: function($q, testService) {
return $q.all([
testService.getAdminTestLevel(),
testService.getAdminTestStatus(),
testService.getAdminTestType()
// and so on for all other promises
])
}
}
然后在您的控制器中,也来自相同的文档
$q.all(promises)
Returns a single promise that will be resolved with an array/hash of values, each value corresponding to the promise at the same index/key in the promises array/hash
您可以访问从 required_data
注入到您的控制器中的结果。
例如 adminTestLevel
将在 required_data[0]
处可用...依此类推,按照您在路由器中创建承诺数组的相同顺序。
目前我的代码是这样的:
resolve: {
adminTestLevel: ['testService', (tes: ITestService) => {
return tes.getAdminTestLevel();
}],
adminTestStatus: ['testService', (tes: ITestService) => {
return tes.getAdminTestStatus();
}],
adminTestType: ['testService', (tes: ITestService) => {
return tes.getAdminTestType();
}],
adminTestGradeType: ['testService', (tes: ITestService) => {
return tes.getAdminTestGradeType()
}],
exams: ['testService', (tes: ITestService) => {
return tes.getExams();
}],
examTypes: ['testService', (tes: ITestService) => {
return tes.getExamTypes();
}],
testOrderBy: ['testService', (tes: ITestService) => {
return tes.getTestOrderBy();
}],
topics: ['testService', (tes: ITestService) => {
return tes.getTestsTopics();
}],
},
有没有一种方法可以简化它,这样我就不必对 ITestService 进行如此多的注入?此外,我不需要拥有所有不同的解决方案,如果可能的话,我想将它们合二为一。
您可以使用$q.all
resolve: {
myDate: function($q, tes) {
return $q.all([tes.getAdminTestLevel(), ... , tes.getTestsTopics()]);
}
}
myData
只会在数组中的所有 promise 都 resolve 之后才 resolve
$q.all
会给你一组结果,你可以在你的控制器中使用,你可以通过索引访问它们,所以它比普通注入更不方便。
你可以尝试使用 $q.all(promises)
来自 ($q) 的文档:
$q.all(promises);
Combines multiple promises into a single promise that is resolved when all of the input promises are resolved.
所以你可以将多个承诺组合成一个承诺数组并等待解决。您的代码可能如下所示:
resolve: {
required_data: function($q, testService) {
return $q.all([
testService.getAdminTestLevel(),
testService.getAdminTestStatus(),
testService.getAdminTestType()
// and so on for all other promises
])
}
}
然后在您的控制器中,也来自相同的文档
$q.all(promises)
Returns a single promise that will be resolved with an array/hash of values, each value corresponding to the promise at the same index/key in the promises array/hash
您可以访问从 required_data
注入到您的控制器中的结果。
例如 adminTestLevel
将在 required_data[0]
处可用...依此类推,按照您在路由器中创建承诺数组的相同顺序。