Jestem nowy w angularjs. Mój cel jest bardzo prosty. Chcę wykonać wywołanie ajax, aby uzyskać dane, a po zakończeniu chcę wykonać drugie wywołanie, aby uzyskać inny zestaw danych, który jest zależny od informacji z pierwszego zestawu.
Próbuję zrobić to wykorzystując mechanizmy obietnic, dzięki czemu mogę wykorzystać łańcuchy zamiast zagnieżdżonych wywołań ajaxowych i lepiej zachować zdolność do posiadania niezależnych funkcji, które mogę powiązać w razie potrzeby.
Mój kod podobny do następującego:
var promiseGetWorkTypes = function ($q, $scope, $http) {
\t console.log("promiseGetWorkTypes");
\t return $q(function (resolve, reject) {
\t \t $http({
\t \t \t method: 'GET',
\t \t \t url: '/WorkTypes'
\t \t }).then(
\t \t \t function (payload) {
\t \t \t \t console.log("Got workttypegroups")
\t \t \t \t console.log(payload);
\t \t \t \t $scope.WorkTypeGroups = payload.data;
\t \t \t \t console.log("End of worktypegroups");
\t \t \t \t resolve(payload);
\t \t \t },
\t \t \t function (payload) {
\t \t \t \t reject(payload);
\t \t \t });
\t });
};
var promiseGetRecentActivities = function ($q, $scope, $http) {
\t console.log("promiseGetRecentActivities");
\t return $q(function (resolve, reject) {
\t \t $http({
\t \t \t method: 'GET',
\t \t \t url: '/RecentHistory'
\t \t }).then(
\t \t \t function (payload) {
\t \t \t \t $scope.RecentActivities = payload.data;
\t \t \t \t resolve(payload);
\t \t \t },
\t \t \t // data contains the response
\t \t \t // status is the HTTP status
\t \t \t // headers is the header getter function
\t \t \t // config is the object that was used to create the HTTP request
\t \t \t function (payload) {
\t \t \t \t reject(payload);
\t \t \t });
\t });
};
var index = angular.module("index", []);
index
.controller('EntitiesController', function ($scope, $http, $timeout, $q) {
\t promiseGetWorkTypes($q, $http, $scope)
\t \t .then(promiseGetRecentActivities($q, $http, $scope));
}
Jednak kiedy patrzę na mojego konsoli debugowania, widzę, że wezwanie do „promiseGetRecentActivities” rozpoczyna się przed wywołaniem Przeładunek Ajax wystąpił dla "promiseGetWorkTypes".
Czego tu brakuje lub robię źle?
użyj '$ q.all' http://jsfiddle.net/ThomasBurleson/QqKuk/ – underscore
Nie, nie' $ q.all() '. OP chce dokonać dwóch wywołań ajax w serii. –
http://stackoverflow.com/questions/23803743/what-is-the-deferred-antipattern-and-how-do-i-avoid-it –