Javascript函数没有正确返回对象
javascript function not correctly returning an object
我没主意了。我有一个javascript函数返回一个对象,但是控制台一直抱怨一个未捕获的TypeError:无法正确读取未定义....的'lat'从控制台转储中,我可以看到所有内容都正确地传递到函数中,并且可以看到该函数正在正常工作。问题在于退货。我不确定是什么问题,这似乎相当直接。旁注,我正在与谷歌地图/地理代码api工作。
function locate(val) {
console.log(val);
geocoder = new google.maps.Geocoder;
geocoder.geocode({'address': val}, function(results, status) {
if (status == 'OK') {
var lat = results[0].geometry.location.lat();
var lng = results[0].geometry.location.lng();
var pos = {
lat: lat,
lng: lng
};
console.log('lat: ' + pos.lat);
console.log('lng: ' + pos.lng);
return pos;
}
else {
alert('Geocode was not successful for the following reason: ' + status);
return null;
}
});
}
for (i = 0; i < address.length; i++) {
var coord = locate(address[i].toString());
var lat = coord.lat;
var lng = coord.lng
console.log(lat);
}
如果错误发生在for
循环中的var lat = coord.lat
,我想这是因为您试图在geocode
回调执行之前访问coord
。
这个问题是由异步引起的。
对于异步行为的更一般的解释例如,请参阅为什么我的变量在我修改后没有改变在函数内部?-异步代码引用
你可以这样做来解决它。
function locate(val, callback) {
console.log(val);
geocoder = new google.maps.Geocoder;
geocoder.geocode({'address': val}, function(results, status) {
if (status == 'OK') {
var lat = results[0].geometry.location.lat();
var lng = results[0].geometry.location.lng();
var pos = {
lat: lat,
lng: lng
};
console.log('lat: ' + pos.lat);
console.log('lng: ' + pos.lng);
return pos;
}
else {
alert('Geocode was not successful for the following reason: ' + status);
return null;
}
});
}
function mycallcack(coord)
{
var lat = coord.lat;
var lng = coord.lng
console.log(lat);
}
for (i = 0; i < address.length; i++) {
locate(address[i].toString(), mycallback(coord));
}
我今天遇到了一个类似的问题,问题是geocode方法不同步运行,所以有一个回调函数。回调函数中的return语句不会返回给locate方法的调用方。
解决这个问题的方法是使用承诺。如果你正在使用jQuery,那么你可以…
function locate(val) {
console.log(val);
var dfd = $.Deferred();
geocoder = new google.maps.Geocoder;
geocoder.geocode({'address': val}, function(results, status) {
if (status === 'OK') {
var lat = results[0].geometry.location.lat();
var lng = results[0].geometry.location.lng();
var pos = {
lat: lat,
lng: lng
};
console.log('lat: ' + pos.lat);
console.log('lng: ' + pos.lng);
dfd.resolve(pos);
}
else {
dfd.reject('Geocode was not successful for the following reason: ' + status);
}
});
return dfd.promise();
}
for (i = 0; i < address.length; i++) {
locate(address[i].toString())
.then(function(coord) {;
var lat = coord.lat;
var lng = coord.lng;
console.log(lat);
})
.catch(function(reason) {
console.log(reason);
});
}
或者在ES6中:
function locate(val) {
return new Promise((resolve,reject) => {
geocoder = new google.maps.Geocoder;
geocoder.geocode({'address': val}, (results, status) => {
if (status === 'OK') {
var lat = results[0].geometry.location.lat();
var lng = results[0].geometry.location.lng();
var pos = {
lat: lat,
lng: lng
};
resolve(pos);
}
else {
reject('Geocode was not successful for the following reason: ' + status);
}
});
}
}
for (i = 0; i < address.length; i++) {
locate(address[i].toString())
.then(coord => {;
var lat = coord.lat;
var lng = coord.lng;
console.log(lat);
})
.catch(reason => {
console.log(reason);
});
}
相关文章:
- javascript函数,它接受两个输入:一个对象和一个键,并返回对象中该键的相应值
- 通过数组值返回对象
- JavaScript:返回对象的函数
- 为什么document.getElementsByClassName(“className”)返回对象
- 如何返回对象
- Promise没有;t返回对象的数组
- 面料:“;鼠标:向下”;在event.target中未返回对象
- Lodash:返回对象的第一个键,该对象的值(即数组)中有一个给定的元素(即字符串)
- Javascript:返回对象
- 为什么 javascript 返回对象位置 true 或 false
- 解析查询查找方法返回对象而不是数组
- 来自函数的返回对象在 jQuery 中未从 $.post 定义
- JavaScript 返回对象未按预期工作
- 返回“[对象对象] NaN” - Javascript
- 何时从创建返回对象
- Javascript:接收对象并返回对象中描述的所有数字的列表的函数
- JSDoc:返回对象结构
- node.js请求返回对象
- 返回对象的ECMAScript 6箭头函数
- 如何从控制器返回对象列表并使用JQuery(SpringMVC,ajax)显示它们