2012-11-15 2 views
0

많은 Stackoverflow 질문, 블로그 및 설명서를 읽은 후에도 배열에 대한이 특정 반복이 작동하지 않는 이유를 여전히 알 수 없습니다.자바 스크립트 배열 개체 반복 속성

jQuery와 javascript (분명히)를 사용하여 GeoJSON file을 가져온 다음 결과 개체의 속성을보고 원하는 키/값 쌍을 가져옵니다. 그 쌍을 찾으면 다른 배열 객체에 삽입하려고합니다.

: 내가 새로 만든 객체 아무것도를 통해 이동하려고 할 때 나는 그것의 길이를 찾으려고하면 내가 기록을 당겨 곳 그러나 그것이이 0입니다

의 길이가 반환됩니까 예상대로 개체가 생성됩니다

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 ] } } 
] 
} 
01,235

_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; 
}, 
새로운 오브젝트에 대한 interation 코드입니다 이 question 보고서 0 길이에 주어진 두 가지 방법을 사용

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] 

: 16,

내가 console.log(this._retRecords); 크롬 보고서는 나는 데이터 집합에서 기대할 수있는 모든 특성을 가진 개체를 표시합니다.

나는 근본적인 것이 빠져 있다는 것을 확신하지만 나는 그것이 무엇인지를 발견 할 수 없다. 어떤 도움, 비판, 대안 방법이 좋을 것입니다!

+2

'return retRecords;가 실행될 때 빈 객체를 반환합니다. Ajax 요청이 아직 완료되지 않았으며 객체에 데이터가 추가되지 않았습니다. –

+1

가능한 중복 [jQuery Ajax 호출에서 올바른 반환 값을 가져올 수 없습니다.] (http://stackoverflow.com/questions/3537434/cant-get-correct-return-value-from-an-jquery-ajax-call) –

+0

@FelixKling 사실 더 나빠졌습니다. 객체는 비어있을뿐만 아니라 나중에 어느 시점에서 수정됩니다. –

답변

1

getJSON() 함수가 즉시 시작되고 (예 : 요청을 보낸다) getJSON 함수가 작업을 완료하기 직전에 반환한다는 것을 이해하지 못하는 것 같습니다. 완성 기능이 호출 될 때 작업이 언젠가 완료 될 것입니다. 따라서 _recordsFromGeoJSON() 함수가 반환 될 때 retRecords은 아직 채워지지 않습니다.

이것은 비동기 프로그래밍입니다. getJSON에 대한 완료 함수는 _recordsFromGeoJSON()이 반환 된 지 오래 후에 언젠가 나중에 호출됩니다. 따라서 동기식, 직렬 프로그래밍처럼 취급 할 수는 없습니다.

대신에 retRecords은 완료 함수 또는 모든 함수에서 데이터를 전달하고 해당 완료 함수를 호출하는 것으로 만 알려져 있습니다. 비동기 프로그래밍이 자바 스크립트에서 작동하는 방식입니다. 완료 기능에서 결과를 getJSON()의 모든 추가 처리를 시작해야합니다. 결과가 아직 알려지지 않았기 때문에 _recordsFromGeoJSON()에서 결과를 반환 할 수 없습니다. 이것은 코딩의 다른 방식이며 다소 고통 스럽지만 자바 스크립트에서 비동기 작업을 다루는 방법입니다.

+1

"completes"와 "returns"의 구분에 유의하십시오. 'getJSON()'은 빠르게 돌아 오지만 거의 완료되지 않았습니다 ;-) –

+0

우수한 사람들입니다. 도와 주셔서 감사합니다. 내 초보자 오류를 극복하고 내 첫 번째 진짜 자바 스크립트 프로젝트는 성공으로 바뀌었다. 감사! – RomaH