解决路由提供者中的多个承诺
Resolving multiple promises in routeprovider
所以我想执行 2 个 http 调用以从我的服务器获取一些组和问题,并在 routeprovider 中解决这两个问题,以便在我获得相关数据之前不会加载相应的控制器。
在我的其他控制器中,我总是使用 initalData 对象来保存数据。
解析部分:
resolve: {
initialData: ["GroupsService" "QuestionsService", function (GroupsService, QuestionsService) {
return {
questions: QuestionsService.getAll(),
groups: GroupsService.getAll()
}]
}
当我尝试分别使用 initialData.questions 和 initialData.groups 访问控制器中的数据时,我收到了 2 个承诺而不是数据,即使来自 http 的回调在控制器被实例化。
QuestionsCtrl.$inect = ["DialogsService", "initialData", "QuestionsService"];
function QuestionsCtrl(DialogsService, questions, groups, QuestionsService) {
//Initialdata object which has 2 Promise properties
//This logs AFTER the callback in both http callbacks
console.log('controller initialized', initialData);
当我用这个替换代码时(没有使用 initialData 对象,而是返回了另外两个对象,它确实起作用了:
resolve: {
questions: function (QuestionsService) {
//$http call for all questions
return QuestionsService.getAll();
},
groups: function (GroupsService) {
//$http call for all groups
return GroupsService.getAll();
}
}
有没有人有任何合乎逻辑的解释,为什么在第一种情况下我得到了承诺(尽管数据实际上存在于客户端中),而第二种情况下却完美无缺?
当您通过 resolve
到路线 it calls $q.all
on it implicitly for you 时。因此,当您 return 解析多个值时,它会等待所有值完成。
在您的示例中 - 您只是 return 编辑了一个包含一些承诺值的对象 - 您没有等待它们,所以它立即通过承诺解决而不是展开它们。
您当然也可以显式地等待它们:
initialData: ["a" "b","$q", function (a, b, $q) {
return $q.all({
questions: a.getAll(),
groups: b.getAll()
});
}]
如果你想决定等待,你需要 return 一个承诺,在你的第一种情况下,它不是一个承诺,而只是一个对象,它恰好有 2 个对象,但是是承诺,但是angular 不知道......如果你想 return 它作为一个单一的解决方案,你可以使用:
return $q.all({ key1: promise, key2: promise });
并添加 $q 作为依赖项
另一件事,当从服务器接收到数据时,promises 不会将它们自身变成原始值,它们保留 promises,在 resolve 的情况下,angular 将挖掘出已解析的值并提供那些而不是承诺。我们需要再次回到 angular 需要知道它正在处理承诺。
所以我想执行 2 个 http 调用以从我的服务器获取一些组和问题,并在 routeprovider 中解决这两个问题,以便在我获得相关数据之前不会加载相应的控制器。
在我的其他控制器中,我总是使用 initalData 对象来保存数据。
解析部分:
resolve: {
initialData: ["GroupsService" "QuestionsService", function (GroupsService, QuestionsService) {
return {
questions: QuestionsService.getAll(),
groups: GroupsService.getAll()
}]
}
当我尝试分别使用 initialData.questions 和 initialData.groups 访问控制器中的数据时,我收到了 2 个承诺而不是数据,即使来自 http 的回调在控制器被实例化。
QuestionsCtrl.$inect = ["DialogsService", "initialData", "QuestionsService"];
function QuestionsCtrl(DialogsService, questions, groups, QuestionsService) {
//Initialdata object which has 2 Promise properties
//This logs AFTER the callback in both http callbacks
console.log('controller initialized', initialData);
当我用这个替换代码时(没有使用 initialData 对象,而是返回了另外两个对象,它确实起作用了:
resolve: {
questions: function (QuestionsService) {
//$http call for all questions
return QuestionsService.getAll();
},
groups: function (GroupsService) {
//$http call for all groups
return GroupsService.getAll();
}
}
有没有人有任何合乎逻辑的解释,为什么在第一种情况下我得到了承诺(尽管数据实际上存在于客户端中),而第二种情况下却完美无缺?
当您通过 resolve
到路线 it calls $q.all
on it implicitly for you 时。因此,当您 return 解析多个值时,它会等待所有值完成。
在您的示例中 - 您只是 return 编辑了一个包含一些承诺值的对象 - 您没有等待它们,所以它立即通过承诺解决而不是展开它们。
您当然也可以显式地等待它们:
initialData: ["a" "b","$q", function (a, b, $q) {
return $q.all({
questions: a.getAll(),
groups: b.getAll()
});
}]
如果你想决定等待,你需要 return 一个承诺,在你的第一种情况下,它不是一个承诺,而只是一个对象,它恰好有 2 个对象,但是是承诺,但是angular 不知道......如果你想 return 它作为一个单一的解决方案,你可以使用:
return $q.all({ key1: promise, key2: promise });
并添加 $q 作为依赖项
另一件事,当从服务器接收到数据时,promises 不会将它们自身变成原始值,它们保留 promises,在 resolve 的情况下,angular 将挖掘出已解析的值并提供那些而不是承诺。我们需要再次回到 angular 需要知道它正在处理承诺。