0

在阅读了许多 Stackoverflow 问题、博客和文档之后,我仍然无法弄清楚为什么这个对任何数组的特定迭代都不起作用。

我正在使用 jQuery 和 javascript(显然)来提取GeoJSON 文件,然后检查结果对象的属性以提取所需的键/值对。当我找到那些我想插入到另一个数组对象中的对时。该对象按我的预期创建,但是当我尝试遍历新创建的对象时没有任何反应,如果我尝试找到它的长度,它返回的长度为 0。

这是我提取记录的地方:

_recordsFromGeoJSON: function(inputText) {
    var retRecords = {},

    $.getJSON(this.GeoJSONUrl, function(data) {
        var geoJSONdata = data;

        $.each(geoJSONdata.features, function(fkey, fvalue) {
            $.each(fvalue.properties, function(pkey, pvalue) {
                var re = new RegExp(inputText, "i");
                var retest = re.test(pvalue);
                if (retest) {
                    retRecords[pvalue] = fvalue.geometry.coordinates;
                    return;
                }
            });
        });
    }); 
    return retRecords;
},

这是对新对象进行交互的代码:

for(var key in this._retRecords) {
        //this function will never run
        var always = foo(bar);
    }

一些示例 GeoJSON:

{
"type": "FeatureCollection",                                                                           
"features": [
{ "type": "Feature", "id": 0, "properties": { "NAME": "14 PARK PLACE PH 4", "AREAID":      3.0, "STR12M": 0.0, "CLS12M": 6.0, "STR4M": 0.0, "CLS4M": 0.0, "TOTAL": 164.0, "OCC": 112.0, "NFU": 0.0, "UNC": 3.0, "DVL": 49.0, "UDVL": 0.0 }, "geometry": { "type": "Point", "coordinates": [ -93.27512816536759, 37.044305883435001 ] } }
,
{ "type": "Feature", "id": 1, "properties": { "NAME": "ALPHA MEADOWS NORTH", "AREAID": 8.0, "STR12M": 0.0, "CLS12M": 0.0, "STR4M": 0.0, "CLS4M": 0.0, "TOTAL": 12.0, "OCC": 0.0, "NFU": 0.0, "UNC": 0.0, "DVL": 0.0, "UDVL": 0.0 }, "geometry": { "type": "Point", "coordinates": [ -92.839131163095786, 37.119205483765143 ] } }
]
}

当我console.log(this._retRecords);Chrome 报告显示具有我期望从数据集中获得的所有属性的对象时:

Object
    14 PARK PLACE PH 4: Array[2]
        0: -93.27512816536759
        1: 37.044305883435
        length: 2
        __proto__: Array[0]
    ALPHA MEADOWS NORTH: Array[2]
        0: -92.839131163095786
        1: 37.119205483765143
        length: 2
        __proto__: Array[0]

使用此问题上给出的两种方法报告 0 长度。

我很确定我错过了一些基本的东西,但我找不到它是什么。任何帮助、批评、替代方法都会很棒!

4

1 回答 1

1

您似乎不明白您的getJSON()函数会立即启动(例如发送请求),然后在 getJSON 函数完成它的工作之前很久就立即返回。它的工作将在稍后调用完成函数时完成。因此,当函数返回retRecords时尚未填充。_recordsFromGeoJSON()

这是异步编程。getJSON 的完成函数将在稍后的某个时间调用,在_recordsFromGeoJSON()返回很久之后。因此,您不能将其视为同步、串行编程。

相反,retRecords仅在完成函数或您将数据传递到该完成函数并从该完成函数调用的任何函数中知道。这就是异步编程在 javascript 中的工作方式。您必须启动getJSON()对完成函数结果的所有进一步处理。而且,您无法返回结果,_recordsFromGeoJSON()因为该函数何时返回结果未知。这是一种不同的编码方式,有点痛苦,但它是您必须在 javascript 中处理异步操作的方式。

于 2012-11-15T04:22:20.127 回答