Javascript Can';t从angular.forEach循环中更新全局变量

Javascript Can';t从angular.forEach循环中更新全局变量,javascript,angularjs,Javascript,Angularjs,在尝试从Angular.forEach循环中修改全局变量时,我似乎被卡住了 我可以很好地修改变量,但当在循环之外访问时,我似乎无法将更改应用于变量 我尝试了多种“var self=this”并在整个循环中使用“this.addresses=[]”来访问数组,但这导致了相同的问题。当我到达我的“return”语句时,我的更改丢失了 代码如下: $scope.getLocation = function(val) { var geocoderRequest = { address: Stri

在尝试从Angular.forEach循环中修改全局变量时,我似乎被卡住了

我可以很好地修改变量,但当在循环之外访问时,我似乎无法将更改应用于变量

我尝试了多种“var self=this”并在整个循环中使用“this.addresses=[]”来访问数组,但这导致了相同的问题。当我到达我的“return”语句时,我的更改丢失了

代码如下:

$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;
$scope.getLocation=函数(val){
var geocoderRequest={
地址:字符串(val),
组件限制:{
“国家”:“美国”
}
};
变量地址=[1];//****将地址显示为[1]*****
geocoder.geocode(geocoderRequest,函数(callbackResult){
console.log('地理代码中的地址:'+地址);//****将地址显示为[1]****
var f='';
angular.forEach(callbackResult.results,函数(项){
log('address in angular:'+addresses);//****将地址显示为[1]*****
if(item.types[0]=“locality”){
对于(f=1;f

})

最终的解决方案是使用Angular的$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});
        }
      });
    };
  })
服务中

.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});
        }
      });
    };
  })
.service('geocoder',function(){
this.geocode=函数(georequest,outerCallback){
var geocoder=new google.maps.geocoder();
地理编码(georequest,函数(结果,状态){
如果(status==google.maps.GeocoderStatus.OK){
var f='';
var地址=[];
forEach(结果,函数(项){
if(item.types[0]=='locality'){

对于(f=1;fy),您需要在回调函数中使用AJAX调用的结果来完成所有工作。有关详细信息,请参阅。关于这一点,有太多类似的问题,请查看,谢谢@Phil,我不知道Angular中的$q服务。这就成功了。