2014-05-06 4 views
0

Je veux exécuter des fonctions dans l'ordre mais je reçois constamment 1,3,4,2 dans la console.Parce que ltt et lott reste 0 dans la fonction getDistanceFromLatLonInKm.Toutes les idées? Merci d'avance.Javascript fonction de la fonction

var ltt=0; 
var lott=0; 

if (navigator.geolocation){ 
    navigator.geolocation.getCurrentPosition(ajmo); 
    console.log('1'); 
} 

function ajmo(position){ 
    console.log('2'); 
    window.ltt=position.coords.latitude; 
    window.lott=position.coords.longitude; 
    document.write(window.ltt); 
} 

console.log('3'); 
document.write(window.ltt); 
document.write("kurac:" + getDistanceFromLatLonInKm(45.332497,14.436384)); 

function getDistanceFromLatLonInKm(lat1,lon1){ 
    console.log('4'); 
    //second 
    var R = 6371; // Radius of the earth in km 
    var dLat = deg2rad(ltt-lat1); // deg2rad below 
    var dLon = deg2rad(lott-lon1); 
    var a = 
    Math.sin(dLat/2) * Math.sin(dLat/2) + 
    Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(ltt)) * 
    Math.sin(dLon/2) * Math.sin(dLon/2) 
    ; 
    var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
    var d = R * c; // Distance in km 
    return d; 
} 

function deg2rad(deg) { 
    return deg * (Math.PI/180) 
} 
+1

'geolocation.getCurrentPosition' est asynchrone, c'est pourquoi 3 se déclenche avant 2 et 4. – Andy

+0

Y a-t-il un moyen de le rendre synchrone ou de le faire avant? – Axon

+0

JavaScript est asynchrone en général, donc écrire simplement le code ne garantit pas la façon dont il est exécuté, vous devez utiliser les fonctions de rappel appropriées pour cela. Lorsque vous utilisez les fonctions de rappel, assurez-vous que le code qui s'y trouve n'est pas exécuté avant d'être prêt à être exécuté. – Jonast92

Répondre

0

Les modifications suivantes feront en sorte que tous les messages de la console sont dans l'ordre 1,2,3,4

var ltt=0; 
var lott=0; 

if (navigator.geolocation){ 
    console.log('1'); 
    navigator.geolocation.getCurrentPosition(ajmo); 
} 

function ajmo(position){ 
    console.log('2'); 
    window.ltt=position.coords.latitude; 
    window.lott=position.coords.longitude; 
    document.write(window.ltt); 

    console.log('3'); 
    document.write(window.ltt); 
    document.write("kurac:" + getDistanceFromLatLonInKm(45.332497,14.436384)); 
} 


function getDistanceFromLatLonInKm(lat1,lon1){ 
    console.log('4'); 
    //second 
    var R = 6371; // Radius of the earth in km 
    var dLat = deg2rad(ltt-lat1); // deg2rad below 
    var dLon = deg2rad(lott-lon1); 
    var a = 
    Math.sin(dLat/2) * Math.sin(dLat/2) + 
    Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(ltt)) * 
    Math.sin(dLon/2) * Math.sin(dLon/2) 
    ; 
    var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
    var d = R * c; // Distance in km 
    return d; 
} 

function deg2rad(deg) { 
    return deg * (Math.PI/180) 
} 
+0

Merci beaucoup. Cela a fonctionné! – Axon

0

Vous n'avez pas besoin d'utiliser des variables globales ici. Il suffit d'inclure l'appel à getDistanceFromLatLonInKm au sein de ajmo, et cela garantira que votre code fait les choses dans le bon ordre.

// call getLocation 
getLocation(); 

function getLocation() { 
    if (navigator.geolocation) { 
    navigator.geolocation.getCurrentPosition(ajmo); 
    } 
} 

function ajmo(position) { 
    var lat = position.coords.latitude; 
    var lng = position.coords.longitude; 

    // don't use document.write - it's considered bad practice 
    // this will get access to an element with id="out" 
    var out = document.getElementById('out'); 

    // now pass lat and lng as new parameters into getDistanceFromLatLonInKm 
    out.innerHTML = 'kurac:' + getDistanceFromLatLonInKm(45.332497, 14.436384, lat, lng); 
} 

// now use the lat/lng arguments instead of the global variables 
function getDistanceFromLatLonInKm(lat_origin, lon_origin, lat_pos, lng_pos) { 
    var R = 6371; 
    var dLat = deg2rad(lat_pos - lat_origin); 
    var dLon = deg2rad(lng_pos - lng_origin); 
    var a = 
    Math.sin(dLat/2) * Math.sin(dLat/2) + 
    Math.cos(deg2rad(lat_origin)) * Math.cos(deg2rad(lat_pos)) * 
    Math.sin(dLon/2) * Math.sin(dLon/2) 
    ; 
    var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); 
    var d = R * c; 
    return d; 
} 

function deg2rad(deg) { 
    return deg * (Math.PI/180) 
} 
+0

C'est tellement mieux.Merci – Axon

0

La raison pour laquelle ils sont appelés hors d'usage est parce que la méthode « geolocation.getCurrentPosition(success, error, options) » est asynchrone.

https://developer.mozilla.org/en-US/docs/WebAPI/Using_geolocation

La (fonction) Ajmo objet que vous donnez à lui est en fait utilisé pour décrire la méthode de rappel. Le script frappe la ligne et envoie une requête asynchrone à la fonction, MAIS il ne va pas attendre une réponse. L'exécution se poursuit même si elle n'a pas encore reçu de réponse. Les lignes restantes sont assez simples avec un surcoût très faible donc elles résolvent beaucoup, beaucoup plus vite que la méthode getCurrentPosition. '2' est exécuté à la fin, mais c'est seulement parce que la méthode a finalement été "rappelée" à la fonction de succès que vous avez créée, "AJMO".

Si vous voulez vous assurer que le code est exécuté dans l'ordre, vous pouvez essayer à la place.


var ltt=0; 
var lott=0; 

function getDistanceFromLatLonInKm(lat1,lon1){ 
    console.log('4'); 
    //second 
    var R = 6371; // Radius of the earth in km 
    var dLat = deg2rad(ltt-lat1); // deg2rad below 
    var dLon = deg2rad(lott-lon1); 
    var a = 
    Math.sin(dLat/2) * Math.sin(dLat/2) + 
    Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(ltt)) * 
    Math.sin(dLon/2) * Math.sin(dLon/2) 
    ; 
    var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
    var d = R * c; // Distance in km 
    return d; 
} 

function ajmo(position){ 
    console.log('2'); 
    window.ltt=position.coords.latitude; 
    window.lott=position.coords.longitude; 
    document.write(window.ltt); 

    console.log('3'); 
    document.write("kurac:" + getDistanceFromLatLonInKm(45.332497,14.436384)); 
} 

if (navigator.geolocation){ 
    navigator.geolocation.getCurrentPosition(ajmo); 
    console.log('1'); 
} 

Cela met les appels à « 2 », « 3 » et « 4 » dans la méthode de rappel avec succès tout en exposant « getDistanceFromLatLonInKm » en fonction séparée si vous avez besoin pour d'autres fins .

+0

Merci beaucoup. Existe-t-il un moyen d'appeler getDistanceFromLatLonInKm avec des variables et avoir une même sortie? Parce que dans mon exemple cette fonction a des arguments codés en dur? – Axon

+0

Ce ne serait pas
document.write ("kurac:" + getDistanceFromLatLonInKm (window.ltt, window.lott));
MrGoodfix