解决路由提供者中的多个承诺

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 需要知道它正在处理承诺。