2010-04-25 3 views
4

firefox 3.6에서 navigator.geolocation.getCurrentPosition (function) API를 사용하고 있습니다. 이 메서드를 반복적으로 호출하려고 할 때 가끔은 제대로 작동하지 않는 경우가 있습니다. 문제는 비동기 콜백 특성 때문이라고 생각했습니다. 어떤 시점에서 콜백 함수가 호출되고 있지만 외부 함수가 이미 종료되어 위치 좌표 값을 잡을 수 없음을 알 수 있습니다.navigator.geolocation의 비동기 특성에 대처할 수 없습니다.

나는 자바 스크립트에 익숙하다. 그래서 나는 다른 자바 스크립트 코더들이 이미 그것을 어떻게 다룰 지 짐작할 수도있을 것이다. 도와주세요.

편집 : 여기

<script type="text/javascript"> 
    function getCurrentLocation() { 
    var currLocation; 
     if(navigator.geolocation) { 
     navigator.geolocation.getCurrentPosition(function(position) { 
      currLocation = new google.maps.LatLng(position.coords.latitude,position.coords.longitude); 
     }); 
     } 
     return currLocation; // this returns undefined sometimes. I need help here 
}  
</script> 

편집 2를 사용하고 코드의 샘플 조각의 : 응답에 대한 감사합니다 모든 사람이, 내가 "수용"모든 답을 선택할 수 싶지만 그렇게 할 수 없습니다.

이제 다른 문제에 직면하고 있습니다. 3 초마다 navigator.geolocation.getCurrentPosition을 호출하지만 응답은 10-15 회 응답 후에 중지됩니다. 어떤 아이디어라도있어?

다시 한 번 감사드립니다.

답변

4

예 작업의 콜백 특성에 문제가 있습니다. getCurrentLocation() 함수를 호출 할 수없고 동 기적으로 반환 될 것으로 예상 할 수 없습니다. 나는 그것이 때때로 작동한다는 것에 놀랐다.

비동기 호출로 작업 할 때 약간 다른 패러다임을 사용해야합니다. 당신은 아마, plotCurrentLocation()을 함수를 호출하고 다음의 예처럼 뭔가해야 다음 plotCurrentLocation() 함수에 전달 된 map 매개 변수 내에서 내부 기능을 사용할 수 있습니다 방법

function plotCurrentLocation(map) { 
    if (navigator.geolocation) { 
     navigator.geolocation.getCurrentPosition(function(position) { 
     var currLocation = new google.maps.LatLng(position.coords.latitude,position.coords.longitude); 

     // plot the currLocation on Google Maps, or handle accordingly: 

     new google.maps.Marker({ title: 'Current Location', 
            map: map, 
            position: currLocation }); 

     map.setCenter(currLocation); 
     }); 
    } 
} 

참고. 자바 스크립트가 closures이므로이 방법이 효과적입니다.


UPDATE :

다른 답변에 의해 제안 콜백 방법은 추상화의 또 다른 레이어를 추가하여이를 해결하기 위해 또 다른 옵션입니다.

+0

안녕하세요! 답장을 보내 주셔서 감사합니다. 나는 그 문제를 해결했다. 이제 저는 자바 스크립트의 성격을 알게되었습니다. 문제가 하나 더 있습니다. 탐색기를 몇 번이나 호출 할 수 있는지에 대한 제한이 있습니다.geolocation.getCurrentPostion, 3 초마다 호출하려고하기 때문에 응답이 10 회 또는 15 회 시도한 후에 중지됩니다. 당신은 어떤 생각이 있습니까 – Raja

+0

@Raja : 아니요, 그런 한계를 알지 못합니다. Geolocation은 여전히 ​​새로운 것입니다. 어쩌면이 문제에 관한 또 다른 질문을 Stack Overflow에 게시 할 수 있습니다. –

5

동기식으로 만들려고하고 있는데 작동하지 않습니다. 앞에서 보았 듯이 함수가 반환 될 때 currLocation이 설정된다는 보장은 없습니다.

function getCurrentLocation(callback) { 
    if(navigator.geolocation) { 
     navigator.geolocation.getCurrentPosition(function(position) { 
     callback(new google.maps.LatLng(position.coords.latitude, 
             position.coords.longitude)); 
     }); 
    } 
    else { 
     throw new Error("Your browser does not support geolocation.");  
    } 
}  

와 클라이언트 코드 : 더 나은

getCurrentLocation(function(loc) 
{ 
    //doSomethingWith loc 
}); 
3

가 사용하는 :

<script type="text/javascript"> 
function getCurrentLocation(callback) { 
    if(!navigator.geolocation) return; 
    navigator.geolocation.getCurrentPosition(function(position) { 
    var currLocation = new google.maps.LatLng(position.coords.latitude,position.coords.longitude); 
    callback(currLocation); 
    }); 
} 
</script> 

var loc = getCurrentLocation(); 
//doSomethingWith loc 
는 귀하의 기능을 변경

: 당신은 아마 지금과 같은이 ...

<script type="text/javascript"> 
getCurrentLocation(function(currLocMap){ 
    // do something with map now that it is ready.. 
}); 
</script> 
+0

... charme처럼 작동합니다. – creality

관련 문제