微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

angularjs – 解决routeprovider中的多个promise

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

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

当您将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()
             });
 }]

原文地址:https://www.jb51.cc/angularjs/240419.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐