【问题标题】:Why can I not save these items to an array in jquery为什么我不能将这些项目保存到 jquery 中的数组中
【发布时间】:2013-09-20 18:36:15
【问题描述】:

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

【问题讨论】:

  • 您是否尝试过调试 polyline.push 是否已执行?调试线元素?另请阅读每个文档(我假设您使用的是 jquery)api.jquery.com/each
  • console.log(polyline)放到循环里面就可以一一看到数据了。
  • 什么是geocode?它可能是异步的。这意味着$.each 完成并且您的console.log 运行之前 geocode 的回调运行。
  • 或者可能连geocode都没有执行,stackoverflow.com/questions/5782611/…这里有一点使用方法
  • geocode 肯定正在执行,因为我可以看到坐标。问题是,直到调用回调之后或 $.each 完成之后才会添加坐标,具体取决于您在上面查看的示例

标签: jquery


【解决方案1】:

地理编码是“非阻塞”或“异步”,这意味着程序将在地理编码完成之前继续执行。这就是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();
            }
        });
    });
}

【讨论】:

  • 我使用回调方法更新了我的答案,但它仍然无法正常工作。可以举个例子吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-17
  • 2022-10-01
  • 2012-07-05
  • 2021-11-05
  • 1970-01-01
  • 2022-01-18
  • 2020-02-21
相关资源
最近更新 更多