使用angular.js的For循环中的Javascript闭包(涉及两个闭包-一个$http.get调用和一个$scope.watch)
我正在使用创建一个角度应用程序。我要做的是循环遍历一组位置,以便在每个位置的纬度和经度上放置一个标记。但是,因为我在for循环中使用了几个闭包,所以标记只出现在数组的最后一个条目上。代码如下:使用angular.js的For循环中的Javascript闭包(涉及两个闭包-一个$http.get调用和一个$scope.watch),javascript,angularjs,google-maps,anonymous-function,iife,Javascript,Angularjs,Google Maps,Anonymous Function,Iife,我正在使用创建一个角度应用程序。我要做的是循环遍历一组位置,以便在每个位置的纬度和经度上放置一个标记。但是,因为我在for循环中使用了几个闭包,所以标记只出现在数组的最后一个条目上。代码如下: $scope.petMarkers = []; $http.get('/api/pets').success(function(foundPets){ $scope.foundPets = foundPets; var listOfPets = $scope.foundPets; var ma
$scope.petMarkers = [];
$http.get('/api/pets').success(function(foundPets){
$scope.foundPets = foundPets;
var listOfPets = $scope.foundPets;
var markerCreator = function(arrayOfPets){
for (var i = 0; i < arrayOfPets.length; i++){
var singlePet = arrayOfPets[i];
var petName = arrayOfPets[i].name;
var identity = singlePet._id;
var location = singlePet.addressFound;
var split = location.split(' ');
var joined = split.join('+');
var httpAddress = 'http://maps.google.com/maps/api/geocode/json?address=' + joined + '&sensor=false';
// anonymous function keeps reference to i, and when console.log is called, for loop has already finished and value of i is set to 4
$http.get(httpAddress).success(function(mapDataAgain){
var ladder = mapDataAgain.results[0].geometry.location.lat;
var longer = mapDataAgain.results[0].geometry.location.lng;
var obj = {
latitude: ladder,
longitude: longer,
title: petName,
id: i
};
$scope.$watch(function(){
console.log('we are in scope.watch');
return $scope.map.bounds;
}, function(){
var markers = [];
//markers.push(obj);
$scope.petMarkers.push(obj);
//$scope.petMarkers = markers;
console.log('markers = ', $scope.petMarkers);
}, true);
});
};
};
markerCreator(listOfPets);
});
$scope.petMarkers=[];
$http.get('/api/pets').success(函数(foundPets){
$scope.foundPets=foundPets;
var listOfPets=$scope.foundPets;
var markerCreator=函数(arrayOfPets){
对于(变量i=0;i
关于如何在这段代码中使用立即调用的函数表达式(IIFE)有什么想法吗?我很难确定是否需要两个IIFE(一个用于$http调用成功时调用的匿名函数,另一个用于作为$scope.$watch参数调用的匿名函数)。我有点迷路了,所以任何解释/帮助/建议都会很有帮助。你不需要for循环,当然也不需要生活。您有一个结果数组,因此只需调用本机
.forEach
函数即可。它接受一个可以对数组中的所有元素执行的回调。这种方法的好处:
- 默认情况下为您提供闭包。回调有自己的作用域,并且在某种程度上是自包含的,与其他代码分离。每个元素都有自己的标记
- 使您的代码更易于阅读。这是编码中经常被忽略的一个细节。您希望努力避免任何形式的技术债务,做到这一点的最简单方法之一是使用本机数组方法。它们清楚地传达了代码的意图,并使调试变得更加容易(特别是在请求帮助时,比如在堆栈溢出时,这是必要的,因为这需要很多时间,并且如果没有人理解您的代码,也没有多少人愿意帮您)