2014-09-24 76 views
0

我似乎在尝试修改Angular.forEach循环内的全局变量时被卡住了。无法更新angular.forEach循环中的全局变量

我可以修改变量的罚款,但我似乎无法得到该变化适用于变量时访问的循环之外。

我已经尝试了各种'var self = this',并在整个循环中使用'this.addresses = []'来访问数组,但导致了同样的问题。当我得到我的“回报”声明时,我的变化就失去了。

下面的代码:

$scope.getLocation = function(val) { 
var geocoderRequest = { 
    address: String(val), 
    componentRestrictions: { 
     'country': 'US' 
    } 
}; 
var addresses = [1]; // **** shows addresses as [1] ***** 
geocoder.geocode(geocoderRequest, function(callbackResult) { 
    console.log('address in geocode: ' + addresses); // ***** shows addresses as [1] **** 
    var f = ''; 
    angular.forEach(callbackResult.results, function(item) { 
     console.log('address in angular: ' + addresses); // **** shows addresses as [1] ***** 
     if (item.types[0] == 'locality') { 
      for (f = 1; f < item.address_components.length; f++) { 
       if (item.address_components[f].types[0] == 
        "administrative_area_level_1") { 
        addresses.push(item.address_components[0].short_name + ', ' + item.address_components[ 
         f].short_name); 
        console.log('addresses in each: ' + addresses); // **** shows addresses as [1, 2, 3] after I 'push' 2 and 3 into addresses array **** 
        break; 
       } 
      } 
     } 
    }); 
}); 
console.log('addresses outside: ' + addresses); // ***** shows addresses as [1] even after pushing 2 and 3 ***** 
return addresses; 

};

+2

您需要使用回调函数中的AJAX调用的结果来完成所有工作。有关详细信息,请参阅[此问题](http://stackoverflow.com/q/14220321/497356)。 – 2014-09-24 00:35:25

+0

有太多这样的类似问题,请检查[this](http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-ajax-call)和[this]( http://stackoverflow.com/questions/6847697/how-to-return-value-from-an-asynchronous-callback-function) – PSL 2014-09-24 00:35:59

+0

查看https://docs.angularjs.org/api/ng/service/$q – Phil 2014-09-24 01:04:13

回答

1

最终的解决方案是使用角度的$ q返回一个承诺:

控制器

.controller('LaunchformController', 
['$scope', '$q', 'geocoder', function ($scope, $q, geocoder) { 

    $scope.getLocation = function(val) {  
    var deferred = $q.defer();  

    geocoder.geocode({ address: String(val), componentRestrictions: {'country':'US'} }, 
     function(callbackResult) {   
     deferred.resolve(callbackResult); 
    }); 

    return deferred.promise;    
    }; 
}]) 

服务

.service('geocoder',function() { 
    this.geocode=function(georequest, outerCallback) { 
     var geocoder = new google.maps.Geocoder(); 
     geocoder.geocode(georequest, function(results, status) {   
     if (status == google.maps.GeocoderStatus.OK) {   
      var f = '';     
      var addresses = []; 
      angular.forEach(results, function(item){ 
      if (item.types[0] == 'locality') {   
       for (f=1;f<item.address_components.length;f++) {    
       if (item.address_components[f].types[0] == "administrative_area_level_1") { 
       addresses.push(item.address_components[0].short_name + ', ' + item.address_components[f].short_name);    
       break; 
       } 
       } 
      }    
      }); 
      outerCallback(addresses);   
     } else { 
      outerCallback({success:false, err: new Error('Geocode was not successful for the following reason: ' + status), results: null}); 
     } 
     }); 
    }; 
    })