Использование обещания с закрытием в службе с несколькими $http.get

Я искал сверху и снизу, но я просто не могу понять q.defer() и создать свое собственное обещание.

У меня есть служба getDataService, которая делает именно это — $http.gets данные с сервера REST. Однако одновременно может быть отправлена ​​только одна из каждой переменной, поэтому, если пользователь хочет запросить у сервера две сущности и вернуть все связанные данные, он должен отправить два запроса. Из-за этого мне пришлось использовать метод, который сохранял i в качестве фактического счетчика (замыкания), который затем запускал мою функцию получения данных соответствующее количество раз:

keepICorrect: function (security) {
        var self = this;
        for (var i = 0 ; i < entity.length; i++) {
            self.getDataFromREST(security, i);
        }
    },

Я вызываю это из моего основного контроллера как обещание:

$scope.apply = function (security) {

    var myDataPromise = getDataService.keepICorrect(security);
    myDataPromise.then(function () {

//DO STUFF

        }, 1);
    }, function (error) {
        alert("Error Retrieving Data");
        return $q.reject(error);
    });
}

Это работало при использовании .getDataFromREST(), но, очевидно, не работает сейчас, так как мне нужно выполнить маршрут через мою новую функцию цикла, keepICorrect().

Мой вопрос заключается в том, как мне создать обещание, которое простирается от моей службы до моего контроллера, но не только это, а также ожидает разрешения или сбоя в зависимости от того, было ли выполнено i количество запросов?


person notAChance    schedule 24.11.2015    source источник


Ответы (1)


Вам нужно создать массив обещаний

keepICorrect: function (security) {
    var self = this;
    var promises = [];
    for (var i = 0 ; i < entity.length; i++) {
        promises.push(self.getDataFromREST(security, i));
    }
    return promises;
},

А затем подождите, пока все они завершатся, используя библиотеку $q в Angular.

$q.all(getDataService.keepICorrect(security))
.then(....
person Simon H    schedule 24.11.2015
comment
Ничего себе, это, кажется, работает немного! Теперь проблема в том, что где-то по пути security (поле пользовательского ввода текста) теперь передается моей функции getDataFromREST() как [object%20HTMLInputElement]. Что там происходит? - person notAChance; 24.11.2015
comment
Ничего, обошлось с security.value. Большое спасибо за вашу помощь, я на шаг ближе к пониманию обещаний. - person notAChance; 24.11.2015