Элементы, добавленные в переменную глобального массива, не сохраняются вне функции добавления - PullRequest
3 голосов
/ 28 ноября 2011

Я пытаюсь использовать JavaScript API Google maps, чтобы нарисовать линию между двумя точками.Две точки должны быть геокодированы (преобразованы в объекты google.maps.LatLong), прежде чем их можно будет использовать для рисования линии.

Функция геокодирования - это codeAddress, и когда она возвращает ее, она вызывает функцию обратного вызова, которая добавляетновый latlong в глобальный массив, называемый точками.По какой-то причине значения, добавленные к точкам, не сохраняются за пределами массива.Я относительно новичок в JavaScript, поэтому я не могу сказать, что может быть не так, любые мысли будут оценены!

var points = new Array();

function addGeocodedLatLongToGlobalList(address) {
        points.push(address);
        alert("added a point " + points[0]); // correctly outputs latlong object
    }

function codeAddress(address) {
    geocoder = new google.maps.Geocoder();
    geocoder.geocode({ 'address': address, }, function (results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
            addGeocodedLatLongToGlobalList(results[0].geometry.location);
        } else {
            alert("Geocode was not successful for the following reason: " + status);
        }
    });
}

function drawLine(address1, address2, color) {

    codeAddress(address1);
    codeAddress(address2);

    alert("there is a point " + points[0]);  //now the points[0] value is undefined
    ...

Ответы [ 2 ]

2 голосов
/ 28 ноября 2011

Я предполагаю, что вы просматриваете массив точек до того, как асинхронная функция геокодирования будет завершена, и точки фактически будут помещены в массив.

Функция geocoder.geocode(), вероятно, является асинхронной, и ваши вызовы функции codeAddress только инициируют этот процесс и завершаются через некоторое время. Это объясняет, почему alert () в вашей функции drawLine() не видит никаких точек - их еще нет. Они будут помещены в массив точек, когда функция geoCode фактически завершит работу и вызовет свой обратный вызов.

0 голосов
/ 28 ноября 2011

Вероятная проблема заключается в том, что функция обратного вызова, которую вы передаете в качестве второго параметра geocoder.geocode, еще не была вызвана. Геокодер мог просто сохранить его для последующего вызова при каком-либо событии. Поместите немного alert в функцию обратного вызова, чтобы увидеть, был ли он действительно вызван!

...
geocoder.geocode({ 'address': address, }, function (results, status) {
        alert("CALLBACK CALLED!!");
        if (status == google.maps.GeocoderStatus.OK) {
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...