解决routeprovider中的多个promise

时间:2015-02-15 14:33:13

标签: angularjs promise route-provider

所以我想执行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();
                    }
                }

有没有人有任何合理的解释为什么,在第一种情况下我得到了承诺(尽管数据实际上存在于客户端),第二种工作完美无瑕?

2 个答案:

答案 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会挖出已解决的值并提供那些而不是承诺。而且我们需要回到那个有角度的需求,知道它正在处理承诺。