Случайная последовательность ответа в $http.get

Я пытаюсь написать функцию, которая отправляет несколько запросов на сервер в зависимости от количества идентификаторов в idArray, Проблема, с которой я сталкиваюсь, заключается в том, что данные, которые помещаются в dataArray не следует правильной последовательности соответствующих идентификаторов idArray, Я пытался добавить timeout к запросам HTTP, так что предыдущий запрос полностью обрабатывается до следующей итерации for петля, но это тоже не похоже на работу. Пожалуйста помоги.

function commonService($http, $q) {
    return {
        getAboutContent: function() {
            var dataArray = [];
            var deferred = $q.defer();
            var idArray = ['about2', 'about3'];
            var count = 0;
            angular.forEach(idArray, function(id) {
                $http.get('server url/' + id).success(function(data) {
                    dataArray.push(data);
                    count++;
                    if (count == idArray.length) {
                        deferred.resolve(dataArray);
                    }
                }).error(function(error) {
                    console.log('error', error);
                    deferred.reject(error);
                });
            });
            return deferred.promise;
        }
    }
}

1 ответ

Решение

Вы не можете с уверенностью сказать, что первый AJAX-вызов будет завершен первым, поскольку это асинхронный вызов. Так что, если вы делаете 3 звонка, используя ваш for В цикле вы не можете гарантировать, что ответ придет в том же порядке. Итак, если вы можете вернуть id с сервера AJAX Call тогда вы можете написать так:

function commonService($http, $q) {
    return {
        getAboutContent: function() {
            var dataArray = [];
            var deferred = $q.defer();
            var idArray = ['about2', 'about3'];
            var count = 0;
            angular.forEach(idArray, function(id) {
                $http.get('server url/' + id).success(function(data) {
                    // Return the "id" from the response and get the index position in the "idArray"
                    var idIndex = idArray.indexOf(data.id);
                    // Then insert data into the specific index as of "id"
                    dataArray[idIndex] = data;

                    count++;
                    if (count == idArray.length) {
                        deferred.resolve(dataArray);
                    }
                }).error(function(error) {
                    console.log('error', error);
                    deferred.reject(error);
                });
            });
            return deferred.promise;
        }
    }
}
Другие вопросы по тегам