2014-07-22 2 views
-1

그래서 나는 다음과 같은 속성을 가진 객체의 배열이 있습니다, 첫 번째 개체는 아무것도 설정이없는 지금 Address, Latitude, LongitudeGoogle지도 API 기능은 시간에 결과를 반환하지 않습니다

poi("139 Main St", 0, 0, "Farmer's Market"), 
poi("18 N Hopkins Ave", 37.4455, -143.7728, "YMCA"), 
poi("42 Universe St", 37.4855, -143.8781, "Original Pizza #32") 

Title을 위도와 경도 때문에 Google의 Geocode API를 사용하여 누락 된 데이터를 채우고 싶었습니다. 내 API 키와 함께 API 스크립트 링크가 포함되어 잘 작동합니다.

그런 다음 배열을 통과하고 누락 된 데이터가있는 객체를 찾는 for 루프를 만들었습니다. 비어있는 셀을 모두 거쳐 올바른 정보로 대체해야합니다. 그러나 정보가 검색 되더라도 루프가 완료된 후에 정보가 검색됩니다. 나는 올바른 정보를 콘솔 할 수 있지만, 함수가 빈 데이터를 반환 한 후에야 알 수있다.

for (i=0; i < poiArray.length; i++) { 
    var curr = poiArray[i]; 

    if (!curr.lat || !curr.long) { 

     geocoder = new google.maps.Geocoder(); 
     geocoder.geocode({ 'address': curr.address }, function(results, status) { 
      if (status == google.maps.GeocoderStatus.OK) { 
       cur.lat = results[0].geometry.location.k; 
       cur.long = results[0].geometry.location.B; 
      } else { 
       console.log('failed to include ' + curr.title); 
       poiArray.splice(i--, 1);  
      } 

     }); 

    } 

} 

나는 timeout과 중첩 기능을 시도했지만, 아무것도 작동하는 것 같다 없습니다. 어떤 제안? 내가 루프, 내 배열 ... 모든 시간의 마지막 번호를 내에서 if (status == google.maps.GeocoderStatus.OK) { 변수 i 후 콘솔 경우 :


나를 조금 더 불확실성을 언급하자. 그리고 루프는 Google의 비동기 데이터가로드 된 후 내 poiArray을 콘솔하면 내 배열의 마지막 항목 만 업데이트하는 것으로 보입니다.

+2

정보가 콘솔에 기록 된 후 poiArray를 확인하고 업데이트되었는지 확인할 수 있습니까? for 루프는 이미 끝났을 지 모르지만 변수가 업데이트되어야한다고 생각합니다. 데이터가 아직 업데이트되지 않은 나머지 코드가 실행되기 시작하는 문제입니까? –

+1

지오 코더가 비동기입니다. 결과는 서버에서 돌아올 때 서버에서 다시 나타납니다. 함수 종료를 통해 문제를 해결할 수 있습니다. – geocodezip

+1

** 비동기 ** 요청을하고 있습니다 - 현재 루프 반복이 끝날 때까지 콜백 함수의 전체 용도 인 데이터를 사용할 수 없습니다. 이것은 당신을 위해 좋은 읽을 거리입니다 - http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-ajax-call. – Adam

답변

2

당신은 기능 폐쇄로 문제를 해결할 수 있습니다. 또한 Google Maps Javascript API v3 (.k, .B)의 문서화되지 않은 속성을 사용해서는 안되며 API 업데이트와 함께 변경되어 코드가 중단됩니다.

var geocoder = new google.maps.Geocoder(); 
function geocodeAddress(curr, i) { 
    geocoder.geocode({ 'address': curr.address }, function(results, status) { 
    if (status == google.maps.GeocoderStatus.OK) { 
     cur.lat = results[0].geometry.location.lat(); 
     cur.long = results[0].geometry.location.lng(); 
    } else { 
     console.log('failed to include ' + curr.title); 
     poiArray.splice(i--, 1);  
    } 
    }); 
} 
for (i=0; i < poiArray.length; i++) { 
    var curr = poiArray[i]; 
    if (!curr.lat || !curr.long) { 
     geocodeAddress(curr, i); 
    } 
} 
+1

for 루프의 다음 반복으로 이동하기 전에 함수가 지오 코드 호출을 완료해야합니까? 그렇다면 상당히 적은 수의 코드로 코드를 늪지 (bog)시킬 수 있습니다. –

+0

광휘. 이것은 완벽하게 작동하고 내가 바보를 한 곳을 정확하게 보여줍니다. .k .B 문제를 지적 해 주셔서 감사합니다. – invot

+0

@ wolffer-east : 최종 사용자는이 스크립트를 실행하지 않습니다. 관리자는 파란색 달에 한 번만 실행합니다. 그 경우에 약간 집중적 인 것이 중요합니까? – invot

관련 문제