0

我认为下面的代码中存在范围问题,但我试图将地理编码回调函数返回的值保存到折线数组中,但是当我运行 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(polyline) 在 $.each 完成之前执行。我需要想办法等到它完成。

Edit2:一位响应者说要使用回调。我使用以下代码进行了尝试,但在 $.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);
    }
4

1 回答 1

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();
            }
        });
    });
}
于 2013-09-20T18:48:39.330 回答