$ http.get中的随机响应序列

时间:2015-11-30 06:50:05

标签: javascript angularjs angularjs-http

我正在尝试编写一个函数,根据idArray中的Ids数量向服务器发送多个请求。我面临的问题是推入dataArray的数据不符合idArray的相应ID的正确顺序。我尝试将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 个答案:

答案 0 :(得分:0)

你不能肯定地说第一个AJAX调用将首先完成,因为那是异步调用。因此,如果您使用for循环进行3次调用,则无法保证响应的顺序相同。因此,假设您可以从服务器AJAX调用返回id,那么您可以这样写:

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