gpt4 book ai didi

javascript - Angular Google map 奇怪的 forloop 问题

转载 作者:行者123 更新时间:2023-12-02 15:39:01 25 4
gpt4 key购买 nike

我的 Angular Controller 中的 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)
});

相同的结果

最佳答案


实际上,您的 for 循环工作正常。
您的回调函数也正常工作
问题在于它们的组合..

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

事件链如下:

循环i=1
地理编码地址(1)
循环i=2
地理编码地址(2)
循环i=3
地理编码地址(3)
循环i=4
地理编码地址(4)
****i=4****
回调(1)
回调(2)
回调(3)
回调(4)

所有回调的 i 值为 4。

因此 i 的控制台日志始终给出 4

关于javascript - Angular Google map 奇怪的 forloop 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32724702/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com