所以我想执行2次http调用以从我的服务器获取一些组和问题,并在routeprovider中解决这两个问题,以便在获得相关数据之前不会加载相应的控制器。
在我的其他控制器中,我总是使用initalData对象来保存数据。
解决方案部分:
resolve: {
initialData: ["GroupsService" "QuestionsService", function (GroupsService, QuestionsService) {
return {
questions: QuestionsService.getAll(),
groups: GroupsService.getAll()
}]
}
当我尝试分别使用initialData.questions和initialData.groups访问控制器中的数据时,我收到了2个promises而不是数据,即使在实例化控制器之前已经记录了来自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();
}
}
有没有人有任何合理的解释为什么,在第一种情况下我得到了承诺(尽管数据实际上存在于客户端),第二种工作完美无瑕?
答案 0 :(得分:8)
将resolve
传递给路线it calls $q.all
on it implicitly for you时。因此,当您在resolve中返回多个值时,它会等待所有值完成。
在你的例子中 - 你刚刚返回了一个包含一些承诺值的对象 - 你没有等待它们,所以它立即用promises解决而不是解包它们。
你当然可以明确地等待它们:
initialData: ["a" "b","$q" function (a, b, $q) {
return $q.all({
questions: a.getAll(),
groups: b.getAll()
});
}]
答案 1 :(得分:2)
如果您希望决定等待,您需要返回一个承诺,在您的第一种情况下,它不是承诺,而只是一个对象,碰巧有2个对象,但是承诺但是,角度不知道......如果你希望将它作为一个单一的决心归还,你可以使用:
return $q.all({ key1: promise, key2: promise });
并添加$ q作为依赖
另一方面,当从服务器收到数据时,承诺并没有将它们变成原始值,它们保持承诺,在解决的情况下,angular会挖出已解决的值并提供那些而不是承诺。而且我们需要回到那个有角度的需求,知道它正在处理承诺。