繁体   English   中英

使用angular.js在For循环中进行Javascript封闭(涉及2个闭包 - $ http.get调用和$ scope。$ watch)

[英]Javascript Closure Within a For Loop (2 closures involved - an $http.get call and a $scope.$watch) using angular.js

我正在使用angular-google-maps创建一个角度应用程序。 我想要做的是循环遍历一系列位置,以便在每个位置的纬度和经度上放置一个标记。 但是,因为我在for循环中使用了几个闭包,所以标记只出现在数组的最后一个条目中。 这是代码:

$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);
});

关于如何使用此代码立即调用函数表达式(IIFE)的任何想法? 我无法弄清楚我是否需​​要两个IIFE(一个用于匿名函数调用$ http调用成功,一个用于匿名函数调用$ scope作为参数。$ watch)。 我有点迷失在这里,所以任何解释/帮助/建议都会有所帮助。

你不需要for循环,你当然不需要IIFE。 您有一系列结果,因此只需调用本机.forEach函数即可。 它需要一个可以在数组中的所有元素上执行的回调。 这种方法的好处:

  • 默认情况下给你关闭。 回调有自己的范围,并且在某种程度上是自包含的并且与其他代码分开。 每个元素都将获得自己的标记
  • 使您的代码更容易阅读。 这是编码中经常被忽视的细节。 您希望努力避免任何技术债务 - 最简单的方法之一是使用本机数组方法。 他们清楚地传达了你的代码的意图,并使调试变得更容易(特别是在寻求帮助时需要,比如堆栈溢出,因为它需要花费很多时间,如果他们无法理解你的话,没有多少人想要帮助你码)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM