Как мне заставить эту функцию возвращать весь массив, когда она завершила нажатие всех маркеров?

function XTW_getLocations(data, div_id, map) {
    var markers = [];
    var marker;
    var latLngBounds = new google.maps.LatLngBounds();
    $(div_id).empty();
    $.getJSON('GetLocations', "country=" + data.id,
        function(data){
            $.each(data, function(index, data) {
                latLngBounds.extend(new google.maps.LatLng(data.location.latitude, data.location.longitude));
                $(div_id).append( new Option(data.name, data.id ) );
                marker = createMarker(data, icon, html, map);
                markers.push(marker);
            });
            map.fitBounds(latLngBounds);
        });
    return markers;
}
1
M.E 13 Сен 2010 в 16:17

2 ответа

Лучший ответ

Вы этого не сделаете, запрос AJAX (getJSON) является асинхронным, что означает, что как только вы выполняете вызов, вы выходите из нормального порядка обработки, вместо этого вы используете callBack, как и при вызове { {X1}}:

function XTW_getLocations(data, div_id, map, callBack) {
    var markers = [];
    var marker;
    var latLngBounds = new google.maps.LatLngBounds();
    $(div_id).empty();
    $.getJSON('GetLocations', "country=" + data.id,
        function(data){
            $.each(data, function(index, data) {
                latLngBounds.extend(new google.maps.LatLng(data.location.latitude, data.location.longitude));
                $(div_id).append( new Option(data.name, data.id ) );
                marker = createMarker(data, icon, html, map);
                markers.push(marker);
            });
            map.fitBounds(latLngBounds);
            callBack(markers); //Callback goes here
        });
    //return markers;
}

Теперь при вызове XTW_getLocations вам нужно добавить обратный вызов к вашему вызову:

XTW_getLocations({some:'data'},'#map','map.png',function(markers){
    //Handle markers here
})
1
Kristoffer Sall-Storgaard 13 Сен 2010 в 12:23

Вы не можете вернуть его, так как он асинхронный (он заполняется, когда ответ возвращается, намного позже, чем функция уже вернулась).

Однако вы можете использовать его для чего-то другого, например, для передачи его другой функции, когда она будет готова / заполнена, например:

function XTW_getLocations(data, div_id, map) {
    var markers = [];
    var marker;
    var latLngBounds = new google.maps.LatLngBounds();
    $(div_id).empty();
    $.getJSON('GetLocations', "country=" + data.id,
        function(data){
            $.each(data, function(index, data) {
                latLngBounds.extend(new google.maps.LatLng(data.location.latitude, data.location.longitude));
                $(div_id).append( new Option(data.name, data.id ) );
                marker = createMarker(data, icon, html, map);
                markers.push(marker);
            });
            anotherFunction(markers);
            map.fitBounds(latLngBounds);
        });
}
2
Nick Craver 13 Сен 2010 в 12:19