首页 文章

解决routeprovider中的多个promise

提问于
浏览
6

所以我想执行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 回答

  • 2

    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()
                 });
     }]
    
  • 8

    如果你希望决定等待,你需要返回一个承诺,在你的第一种情况下它不是一个承诺,而是它只是一个对象,碰巧有2个对象然而是承诺,但角度不会知道...如果您希望将其作为单一决议返回,您可以使用:

    return $q.all({ key1: promise, key2: promise });
    

    并添加$ q作为依赖项

    另一件事,承诺不会在从服务器收到数据时将它们变为原始值,它们保持承诺,在解决的情况下,角度将挖出已解决的值并提供那些而不是承诺 . 而且我们需要回到那个有角度的需求,知道它正在处理承诺 .

相关问题