我认为下面的代码中存在范围问题,但我正在尝试将地理编码回调函数返回的值保存到折线数组,但是当我运行console.log时,数组为空。
var addPolyline = function(map, line) {
var polyline = [];
$.each(line, function(index, address){
geocode(address, function(latlng){
polyline.push(latlng);
console.log(polyline);
});
});
console.log(polyline);
}
有人可以告诉我如何将回调函数中的元素添加到数组中吗?感谢
编辑:这些点正在添加到折线阵列中,但是在$ .each完成之前正在执行console.log(折线)。我需要想办法等到它完成。
编辑2:一位回应者表示要使用回调。我尝试使用以下代码,但在$ .each完成之前仍在执行回调(折线)。
var addPolyline = function(map, line) {
formatPolyline(line, function(polyline){
console.log(polyline);
});
}
var formatPolyline = function(line, callback) {
var polyline = [];
$.each(line, function(index, address){
geocode(address, function(latlng){
polyline.push(latlng);
console.log(polyline);
});
});
callback(polyline);
}
答案 0 :(得分:2)
地理编码是“非阻塞”或“异步”,这意味着程序将在地理编码完成之前继续执行。这就是console.log(polyline)
记录一个空数组的原因。
解决方案是使用回调。
下面的代码使用一个计数器,该计数器在每个地理编码回调时递增。在最后一次地理编码调用;调用函数myCallback,您可以在其中放置您喜欢的任何代码。
var addPolyline = function(map, line) {
var polyline = [],
total = $(line).length,
count = 0,
myCallback = function(){
console.log(polyline);
};
$.each(line, function(index, address){
geocode(address, function(latlng){
polyline.push(latlng);
count++;
if(count === total){
myCallback();
}
});
});
}