我的角度控制器中的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)
});
相同的结果
答案 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个