2016-07-10 11 views
0

Ich habe script1 und script2. Hier ist ein Code von script1:Javascript Verständnis Callback-Funktionen und Ausführung

var pos; 

function foo(param){pos = param;} 

bar(foo); 

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

Wie richtig passiere ich foo als Callback-Funktion bar und Ketten es navigator.geolocation.getCurrentPosition? Wie kann ich pos zurück zu script1 bekommen? Warum kann ich nicht einfach die Werte zurückgeben?

+1

Wie wird 'success' aufgerufen wird? –

+0

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

+0

Aufgrund des asynchronen Verhaltens von 'navigator.geolocation.getCurrentPosition' empfehle ich Versprechungen für das, wonach Sie suchen. Hier ist eine Antwort, die ich für diesen Anwendungsfall früher heute eingereicht habe: http://stackoverflow.com/questions/38287407/cant-return-get-access-to-a-variable-inside-a-function/38287844#38287844 – jmealy

Antwort

3

Sie müssen den Rückruf an den Erfolg Funktion wieder passieren

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

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

das funktioniert, aber als jemand von einem Java-Hintergrund, ich verstehe einfach nicht - obwohl ich weiß, dass Funktionen Objekte in Javascript sind –

+0

GetCurrentPostion (Erfolg, fehlgeschlagen) übergibt zwei Funktionszeiger async aufrufen und diese Methoden nichts wissen über den Bereich, in dem es aufgerufen wird - das gleiche gilt für Java. in Parametern sind private Bereiche - genau wie 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'); 
}