Я думаю, что в этом коде есть проблема с областью, но я пытаюсь сохранить значения, возвращаемые функцией обратного вызова геокода, в массив полилинии, но когда я запускаю 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);
}
Может кто-нибудь рассказать мне, как я могу добавить элементы из функции обратного вызова в массив? благодаря
Изменить: точки добавляются в массив полилинии, но console.log (полилиния) выполняется до завершения $.each. Мне нужно выяснить, как подождать, пока он не закончится.
Edit2: Один ответчик сказал использовать обратные вызовы. Я попробовал это со следующим кодом, но callback (полилиния) все еще выполняется до того, как закончится $.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);
}
геокод является "неблокирующим" или "асинхронным", что означает, что программа продолжит выполнение до завершения геокода. Вот почему 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();
}
});
});
}