2015-02-15 20 views
6

Bu nedenle, sunucumdan bazı grup ve soruları almak için 2 toplu çağrı yürütmek istedim ve bunların her ikisi de ilgili verilere sahip olmadan önce karşılık gelen denetleyicinin yüklenmemesi için ruteprovider'da çözüldü.Ruteprovider'da çoklu vaatleri çözme

Diğer denetleyicilerimde, verileri tutmak için her zaman bir initalData nesnesiyle çalıştım.

çözmek kısmı: I, sırasıyla initialData.questions ve initialData.groups kullanılarak kontrolör verilere erişmek için çalışılmıştır

resolve: { 
       initialData: ["GroupsService" "QuestionsService", function (GroupsService, QuestionsService) { 
        return { 
        questions: QuestionsService.getAll(), 
        groups: GroupsService.getAll() 
       }] 
      } 

, ancak bile geri arama gelen da, bunun yerine verilerin 2 söz alınan Denetleyicinin başlatılmasından önce http kaydedildi. Bununla kod yerini zaman

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); 

(yerine iki diğer nesneleri döndü bir initialData nesnesini kullanın vermedi yaptım eser:

resolve: { 
        questions: function (QuestionsService) { 
         //$http call for all questions 
         return QuestionsService.getAll(); 
        }, 
        groups: function (GroupsService) { 
         //$http call for all groups 
         return GroupsService.getAll(); 
        } 
       } 

kimse neden de herhangi mantıklı bir açıklama var mı ilk vaka (veri istemci aslında mevcut olduğunu rağmen) ben sözlerini geri aldım, ikincisi sorunsuz çalıştı?

cevap

8

bir rota it calls $q.all on it implicitly for you için resolve geçtiğinizde. Eğer kararlılığı içinde birden çok değer döndüğünüzde yüzden bekler f ya da hepsi bitirmek için.

Örneğinizde - vaat edilen bazı değerler içeren bir nesneyi döndünüz - onları beklemediniz, bu yüzden bunları kaldırmak yerine sözlerle hemen çözüme kavuşturun.

Sen elbette açıkça onlar için de bekleyebilir:

initialData: ["a" "b","$q" function (a, b, $q) { 
     return $q.all({ 
        questions: a.getAll(), 
        groups: b.getAll() 
      }); 
}] 
2

beklemek kararlılığını isterseniz, ilk durumda, bir söz dönmek gerekir o, bir söz değil, aksine sadece bir obje, bununla birlikte söz edilir 2 nesneler var olur, ama açısal bunu bilmeyecek ... tek bir kararlılıkla olarak iade etmek isterseniz kullanabilirsiniz:

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

ve bağımlılık

olarak $ q eklemek

Başka bir şey, vaatler veriyi sunucudan aldığında kendileri ham değerlere dönüştürmez, vaatler kalır, çözülme durumunda, açısal karar çözülmüş değeri kazar ve vaatler yerine bunları sağlar. Ve yine sözler ile uğraştığını bilmek için bu açısal ihtiyaçlara geri dönmeliyiz.