2016-07-10 4 views
0

나는 script1script2입니다.자바는 콜백 함수와 실행을 이해합니다.

이제
var pos; 

function foo(param){pos = param;} 

bar(foo); 

script2에서 :

function bar(callback){ 
    //prints 'function' 
    console.log(typeof callback); 

    navigator.geolocation.getCurrentPosition(
     success, 
     fail 
    ); 
} 

function success(position, callback){ 
    //prints 'undefined' 
    console.log(typeof callback); 
    var pos= { 
     lat: position.coords.latitude, 
     long: position.coords.longitude 
    }; 
    callback(pos); 
} 

어떻게 제대로 bar에 콜백 함수로 foo을 통과하고 navigator.geolocation.getCurrentPosition에 체인 않습니다 여기에 script1에서 일부 코드는? posscript1으로 올바르게 다시 가져 오려면 어떻게해야합니까? 대신 값을 반환 할 수없는 이유는 무엇입니까?

+1

에 콜백을 다시 통과해야합니까? –

+0

https://developer.mozilla.org/en-US/docs/Web/API/Geolocation/getCurrentPosition –

+0

'navigator.geolocation.getCurrentPosition'의 비동기 동작으로 인해, 내가하고있는 것에 대한 약속을 사용하는 것이 좋습니다. 오늘이 사용 사례에 대해 제출 한 답변은 다음과 같습니다. http://stackoverflow.com/questions/38287407/cant-return-get-access-to-a-variable-inside-a-function/38287844#38287844 – jmealy

답변

3

당신은`호출되는 success`되는 방법 성공 기능

function bar(callback){ 
    //prints 'function' 
    console.log(typeof callback); 

    navigator.geolocation.getCurrentPosition(
     function(pos){ 
      // repass callback to success method 
      success(pos, callback); 
     }, 
     fail 
    ); 
} 
+0

이 작동하지만 자바 배경에서 누군가로, 난 그냥 이해할 수 없다 - 비록 함수가 자바 스크립트에있는 객체 인 것을 알고있다하더라도 –

+0

getCurrentPostion (성공, 실패)은 비동기를 호출하는 두 개의 함수 포인터를 전달하고 그 메소드는 아무것도 모릅니다. 그것이 호출되는 범위에 대해서 - Java와 동일하게 적용됩니다. in 매개 변수는 Java와 마찬가지로 사적인 범위입니다. – Steve

0
var pos; 

function foo(param){pos=param; console.log(param);} 

bar(foo); 

function bar(callback){ 
    //prints 'function' 
    //console.log(callback); 

    navigator.geolocation.getCurrentPosition(
     success.bind(null, callback), 
     fail 
    ); 

} 

function success(callback, position){ 
    //prints 'function' 

    var pos= { 
     lat: position.coords.latitude, 
     long: position.coords.longitude 
    }; 

    callback(pos); 
} 

function fail(){ 
    console.log('failed'); 
}