如何为延迟触发器获取正确的索引

How to get the right index for a delayed trigger?

本文关键字:索引 获取 触发器 延迟      更新时间:2023-09-26

以下问题:我有一个角度模块,$http.get来获取一些谷歌坐标。此函数触发另一个函数。此函数再次触发另一个函数。一会儿就说通了。

角度模块:

    var myApp = angular.module('wmw', []);
        myApp.controller('MainCtrl', function ($scope, $http) {
            //Angular Method
            $scope.getTargetCords = function (data) {
                $http.get(data).success(function (response) {
                    $(document).triggerHandler('my_func:data-received', [response]);
                });
            };
        });

成功:

var onSuccess = function(position) {
    currentLat = position.coords.latitude ;
    currentLng = position.coords.longitude;
    for(i = 0; i<locations.length;i++){
        var destUrl = 'http://maps.googleapis.com/maps/api/geocode/xml?address=' + locations[i][ 'street' ] + ',' + locations[i][ 'city' ] + ',Deutschland' + '&sensor=true';
        var MyAngularScope = angular.element($("#MainCtrlId")).scope();
        MyAngularScope.getTargetCords('http://maps.googleapis.com/maps/api/geocode/xml?address=' + locations[i][ 'street' ] + ',' + locations[i][ 'city' ] + ',Deutschland' + '&sensor=true');
    }   
};
navigator.geolocation.getCurrentPosition(onSuccess, onError);

两个触发器:

$(document).on('my_func:data-received', function(event, response) {
    map[s] = response;
    s++;
    if(s === locations.length){
        $(document).triggerHandler('allData');
    }
});
$(document).on('allData', function(){
    var thecoords = [];
    var distance = [];
    $('#filter-list').empty();
    for(var i = 0; i < locations.length; i++){
        thecoords[0] = $(map[i]).find('lat').first().text();
        thecoords[1] = $(map[i]).find('lng').first().text();
        distance[i] = calculateDistance(currentLat, currentLng, thecoords[0], thecoords[1]);
        locations[i]['distance'] = distance[i];
    }
    locations.sort(function(a,b) 
        { return a.distance - b.distance;}
    );
    for(var i = 0;i < locations.length; i++){
        distance[i] = locations[i]['distance'].toFixed(2);
        distance[i] += ' KM';
        locations[i]['distance'] = distance[i];
    }
    $('.loading').hide();
    for(var i = 0; i<=5; i++){
        addItemToList(locations[i]);        
    }
});

发生了什么事情?使用这些函数,我检索当前位置,最远位置,并通过纬度/经度计算KM的差异。我在网上找到的计算函数。 .loading只是一个带有"计算路线..."和透明的灰色背景。因此,一旦一切都完成,每条路线的"距离"将更改为计算的距离。

这个问题:在我的".on('my_func:data-received')"中,我使用了变量"s",它在开头为 0。在我的逻辑中,我想,这会把一个接一个的响应放在我的"地图"中。但是现在我意识到,"接收到的数据"不是一个接一个地调用的,而是每次检索数据时调用的。因此,当位置 [0] 调用$http.get,然后在该位置 [1] 调用$http.get之后,可能会发生这种情况,该位置 [1] 更早地检索数据。我怎样才能让我的"s"始终是正确的数字?这样当我有位置[1]调用地图[1]时$http.get地图[1]将是位置[1]响应吗?

我的头正在爆炸,因为我找不到解决这个问题的方法,尽管它似乎很基本。

提前谢谢你!

由于重组应用程序不是一种选择,因此获得正确顺序的另一种相当快速的方法是将响应数据映射到原始数组。响应包含使用数组中的数据构建的 url,这可能会为您提供所需的内容。