0

我一直在玩 JavaScript,有些东西我不太明白。我在这里有这段代码:

$.getJSON('data.json', function(obj) {

    for( var p in obj.List )
    {               
        datas['id'] = obj.List[p].ListingId;
        datas['area'] = area;

        //console.log(datas);

        var geocoder = new google.maps.Geocoder();              
        geocoder.geocode( { 'address': datas['area'] }, function(results,status)
        {

            if(status == google.maps.GeocoderStatus.OK)
            {
                var latlng = new google.maps.LatLng(results[0].geometry.location.Ya, results[0].geometry.location.Za);

                datas['latlng'] = latlng;

                //console.log(datas);                       

            }                               
        });
     }      
});

好的,现在假设 for 循环运行 3 次。如果我们取消注释第一行“console.log(datas)”并运行页面,在控制台中我们会看到 3 个“datas”对象,它们有自己的“id”和“area”。如果我在地理编码回调中注释第一个“console.log(datas)”并取消注释第二个“console.log(datas)”,当我运行代码时,所有 3 个“datas”对象在“ id”、“区域”和“latlng”。而我预计这 3 个“数据”对象会因它们自己的 latlngs 而不同。

有任何想法吗?

4

3 回答 3

1

我认为这是一个范围问题。到最后一次console.log运行时,p变量已经引用了最后一个 obj。您需要p在新范围内捕获。

for( var p in obj.List ) { 

  (function(p) {

    datas['id'] = obj.List[p].ListingId;
    datas['area'] = area;

    geocoder.geocode( { 'address': datas['area'] }, function(results,status) {
      ...
    });

  }(p));

}
于 2012-11-22T21:39:24.323 回答
1

您传递给函数的函数何时geocoder.geocode运行?如果它没有立即运行,则 for 循环将在运行地理编码功能之前运行所有三遍。这意味着datas['id']并且datas['area']将被设置为循环的最后一次迭代......在这种情况下,您需要在地理编码函数的闭包内捕获数据数组。

在这种情况下,您需要类似:

$.getJSON('data.json', function(obj) {

    for( var p in obj.List )
    {               
        datas['id'] = obj.List[p].ListingId;
        datas['area'] = area;

        //console.log(datas);

        var geocoder = new google.maps.Geocoder();              
        geocoder.geocode( { 'address': datas['area'] }, function(datas){ return function(results,status)
        {

            if(status == google.maps.GeocoderStatus.OK)
            {
                var latlng = new google.maps.LatLng(results[0].geometry.location.Ya, results[0].geometry.location.Za);

                datas['latlng'] = latlng;

                //console.log(datas);                       

            }                               
        }}(datas));
     }      
});

这可以防止 for 循环更新匿名函数使用的 datas 变量。

于 2012-11-22T21:51:40.593 回答
0

我认为必须将数据声明为全局数组?有吗?

于 2012-11-22T21:38:31.800 回答