为什么我不能在jquery中将这些项保存到数组中

时间:2013-09-20 18:36:16

标签: jquery

我认为下面的代码中存在范围问题,但我正在尝试将地理编码回调函数返回的值保存到折线数组,但是当我运行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);
    }

1 个答案:

答案 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();
            }
        });
    });
}