【问题标题】:Random sequence of response in $http.get$http.get 中的随机响应序列
【发布时间】:2016-03-03 18:06:06
【问题描述】:

我正在尝试编写一个函数,该函数根据idArray 中的 Id 数量向服务器发送多个请求。我面临的问题是推入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;
        }
    }
}

【问题讨论】:

  • 响应头/正文中是否有一些东西可以用来在返回之前以正确的顺序排列响应?
  • 响应在每个对象中都有唯一的标题,但我不确定如何使用它们,因为如果我使用 if(data.title== 'myTitle'){dataArray.push(data )},如果标题与 myTitle 不匹配,它将跳过将数据推送到数组中,因此该迭代将丢失和浪费。

标签: javascript angularjs angularjs-http


【解决方案1】:

您不能肯定地说第一个 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;
        }
    }
}

【讨论】:

  • 根据您的建议,我添加了一个属性 Id 并将一个与 idArray 中的值相同的值分配给我的实际数据。这通过在这个随机序列本身中插入 dataArray 中的值来匹配随机序列来解决这个问题。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-02
  • 2017-08-18
  • 1970-01-01
  • 2023-03-28
  • 2019-01-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多