Angular Google映射怪异的forloop问题

时间:2015-09-22 18:53:17

标签: javascript angularjs google-maps for-loop callback

我的角度控制器中的for循环有一个奇怪的问题:

我有一个像这样定义的数组:

$rootScope.places = [
    {
        name : "Sleep",
        address : "piazza navona",
        kind : "sleep",
    },
    {
        name : "Borghese",
        address : "villa borghese",
        kind : "nature",
    },
    {
        name : "Trastevere",
        address : "trastevere",
        kind : "relax",
    },
    {
        name : "Collosseo",
        address : "collosseo",
        kind: "cultural",
    }
];

带回调参数的地理编码函数:

    var geocodeAddress = function(address, callback) {
    var geocoder = new google.maps.Geocoder();
    geocoder.geocode( { 'address': address}, function(results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
            callback(results[0].geometry.location);
        } else {
            callback(-1);
            console.log("Geocode was not successful for the following reason: " + status);
        }
    });
};

如果我尝试地理编码并为我的数组中的每个位置添加一个标记:

        for (var i = 0; i < $rootScope.places.length; i ++) {
        geocodeAddress($rootScope.places[i].address, function(latLng){
            console.log("Array len : " + $rootScope.places.length);
            console.log("var i : " + i);
            console.log("Array : " + $rootScope.places);
            console.log($rootScope.places[i].name + " at " + $rootScope.places[i].address + " geocoded");
            console.log(latLng);
            markers.push(designMarker($rootScope.places[i].kind, latLng));
        });
    }
    $scope.markers = markers;
  

console.log(“Array len:”+ $ rootScope.places.length);

说4

  

console.log(“var i:”+ i);

也说4!

很明显:

  

的console.log($ rootScope.places [I]);

说未定义

我不明白这种奇怪的行为。它与回调函数有关吗?

感谢您的帮助

最高

编辑:

嗨,谢谢你的帮助。 知道我理解for循环是如何工作的。 我试过这个:

        function synchronousLoop(i) {
        if (i < $rootScope.places.length) {
            geocodeAddress($rootScope.places[i].address, function(latLng){
                markers.push(designMarker($rootScope.places[i].kind, latLng));
                synchronousLoop(i+1);
            });
        }
    }
    synchronousLoop(0);

但显示的唯一标记是我$rootScope.places

中的第一个

有任何线索吗?

感谢您的宝贵帮助。

编辑2:

我尝试在回调函数中推送我的标记:

        function synchronousLoop(i, callback) {
        if (i < $rootScope.places.length) {
            geocodeAddress($rootScope.places[i].address, function(latLng){
                markers.push(designMarker($rootScope.places[i].kind, latLng));
                synchronousLoop(i+1);
            });
        }
        callback && callback();
    }
    synchronousLoop(0, function() {
        $scope.markers = markers;
        console.log($scope.markers)
    });

相同的结果

1 个答案:

答案 0 :(得分:2)


实际上你的 for 循环正常工作 您的回调功能也正常工作 问题在于它们的组合。

对于第一次迭代,i = 1,geocodeAddress(1)被称为
第二次迭代i = 2,geocodeAddress(2)被调用....等等 geocodeAddress(1)需要一些时间来处理,直到调用回调(1)时,i的值达到4 ..

事件链如下:

循环i = 1
geocodeAddress(1)
循环i = 2
geocodeAddress(2)
循环i = 3
geocodeAddress(3)
循环i = 4
geocodeAddress(4)
**** i = 4的****
回调(1)
回调(2)
回调(3)
回调(4)

所有回调的i值为4.

因此 i 的控制台日志总是给出4个