2016-07-10 7 views
0

У меня есть script1 и script2. Вот код из script1:Функции и выполнение функции обратного вызова Javascript

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); 
} 

Как правильно передать foo как функцию обратного вызова bar и приковать его navigator.geolocation.getCurrentPosition? Как я могу правильно получить pos до script1? Почему я не могу просто вернуть значения?

+1

Как 'success' называют? –

+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

Вы должны повторно пройти обратный вызов функции успеха

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

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

это работает, но как кто-то из фона Java, я просто не понимаю - хотя я знаю, что функции являются объектами в javascript –

+0

getCurrentPostion (успех, сбой) пропускает два указателя на функцию для вызова async, и эти методы ничего не знают о области, в которой он вызывается - то же самое относится к Java. в параметрах есть личная область действия - точно так же, как 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'); 
} 
Смежные вопросы