EDIT
Pierwsza odpowiedź jest elegancki jeden, ale, jak wspomniano kilka razy w tej kwestii i kolejne pytania na StackOverflow, problemem jest to, że usługa i sterownik uruchomić swoje rzeczy, zanim dane faktycznie dotrą.
(Ostatni komentarz na pierwszej odpowiedzi :)
Tak, problemem jest to, że wywołania API zakończyć po wykonaniu usługi biegnie i wszystko wraca do sterownika, patrz tutaj screencast.com/t/ uRKMZ1IgGpb7 ... To jest moje pytanie BASE, w jaki sposób mogę czekać na wszystkie części, aby dane dotarły?
To tak jak mówię to na powtórzenia, jaki sposób uczynić usługę, która wypełnia tablicę po pomyślnym pobierania danych i kontroler uzyskiwanie danych po to wszystko dzieje, bo jak widać w mój zrzut ekranu, rzeczy działają w innej kolejności.
mam ten kod:
var deferred = $q.defer();
$http.get('../wordpress/api/core/get_category_posts/?category_id=14 ').success(function(data) {
//we're emptying the array on every call
theData = [];
catName = data.category.slug;
theData = data;
theData.name = catName;
aggregatedData.push(theData);
});
$http.get('../wordpress/api/core/get_category_posts/?category_id=15 ').success(function(data) {
theData = [];
catName = data.category.slug;
theData = data;
theData.name = catName;
aggregatedData.push(theData);
});
$http.get('../wordpress/api/core/get_category_posts/?category_id=16 ').success(function(data) {
theData = [];
catName = data.category.slug;
theData = data;
theData.name = catName;
aggregatedData.push(theData);
});
$http.get('../wordpress/api/core/get_category_posts/?category_id=17 ').success(function(data) {
theData = [];
catName = data.category.slug;
theData = data;
theData.name = catName;
aggregatedData.push(theData);
});
//deferred.resolve(aggregatedData);
$timeout(function() {
deferred.resolve(aggregatedData);
}, 1000);
/*//deferred.reject('There is a connection problem.');
if (myservice._initialized) {
$rootScope.$broadcast('postsList', deferred.promise);
}*/
//myservice._initialized = true;
myservice = deferred.promise;
return deferred.promise;
dla życia mnie nie mogę zrozumieć, dlaczego muszę umieścić limit czasu przy przejściu wynikowy tablicę do odroczenia?
Czy zasada nie powinna brzmieć, odłożyć czekanie na informacje, a następnie zwrócić obietnicę? Jaki jest sens tej 1 sekundy? Z tego, co rozumiem, odroczenie powinno być w stanie czekać tak długo, jak potrzeba, aby API zwróciło wynik i zwróciło obiecane dane.
Jestem naprawdę zdezorientowany, przez ostatnie dwie godziny uderzałem głową o ściany, ponieważ nie otrzymywałem żadnych danych w moim kontrolerze, tylko gdy umieściłem tam ten czas.
Czy chcesz umieścić wszystkie zwracane wartości '$ http.get' w [' $ q.all'] (http://docs.angularjs.org/api/ng.$q)? –
Przerzucam wszystkie wyprowadzone tablice w zbiorczych danych, aby móc przekazać ten obiekt do $ q. Chcę zrozumieć, co tak naprawdę się dzieje, oto jsFiddle, http://jsfiddle.net/tjnWQ/ .... Jak działa tutaj obietnica. –
Szczerze mówiąc, jestem podekscytowany frustracją. Już prawie 6 tygodni staram się opanować ten Angular, naprawdę podoba mi się ten pomysł, rozumiem bity i kawałki, mam 3-4 mini aplikacje działające, ale są pewne dziury w mojej wiedzy o tym kątowym ramy, które staną się przeszkodą w tworzeniu rzeczywistego produktu użytkowego :). Poddałem się i wydałem dużo pieniędzy na tę książkę http://www.packtpub.com/angularjs-web-application- development/book –