Javascript Can';t从angular.forEach循环中更新全局变量
在尝试从Angular.forEach循环中修改全局变量时,我似乎被卡住了 我可以很好地修改变量,但当在循环之外访问时,我似乎无法将更改应用于变量 我尝试了多种“var self=this”并在整个循环中使用“this.addresses=[]”来访问数组,但这导致了相同的问题。当我到达我的“return”语句时,我的更改丢失了 代码如下: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
$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服务。这就成功了。