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 ] } }
]
}

Chromeレポートにconsole.log(this._retRecords);、データセットから期待したすべてのプロパティを含むオブジェクトが表示されると、次のようになります。

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 に答える