Разрешаване на множество обещания в 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();
                    }
                }

Някой има ли някакво логично обяснение защо в първия случай получих обещания (въпреки че данните действително присъстваха в клиента), а вторият работи безупречно?


person Robin-Hoodie    schedule 15.02.2015    source източник


Отговори (2)


Когато подадете resolve към маршрут извиква $q.all върху него имплицитно за вас. Така че, когато върнете множество стойности при разрешаване, той чака всички да завършат.

Във вашия пример - вие току-що върнахте обект, съдържащ някои стойности, които са обещания - не ги изчакахте, така че беше решен незабавно с обещанията, вместо да ги разопаковате.

Можете, разбира се, изрично да изчакате и тях:

 initialData: ["a" "b","$q" function (a, b, $q) {
      return $q.all({
                     questions: a.getAll(),
                     groups: b.getAll()
             });
 }]
person Benjamin Gruenbaum    schedule 15.02.2015

Ако желаете да решите да изчакате, трябва да върнете обещание, в първия случай това не е обещание, по-скоро е просто обект, случва се да има 2 обекта, които обаче са обещания, но angular няма да знае това... Ако искате да го върнете като единична резолюция, можете да използвате:

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

и добавете $q като зависимост

Друго нещо, обещанията не се превръщат в необработени стойности, когато данните се получават от сървъра, те остават обещания, в случай на разрешаване, angular ще изкопае разрешената стойност и ще ги предостави вместо обещанията. И отново трябва да се върнем към това, че Angular трябва да знае, че работи с обещания.

person Jens    schedule 15.02.2015