2016-09-29 4 views
0
var InfoURL 

$.get("https://ipinfo.io", function(response) { 
    if(response.ip.indexOf(':') > -1) { 
     InfoURL = 'google.com'; 
    } else { 
     InfoURL = 'google.ch'; 
    } 
    alert(InfoURL); 
}, "jsonp"); 

alert (InfoURL); 

Alors pourquoi la seconde alert est une variable vide? Que dois-je changer pour que la variable soit globale?La variable globale définie dans la fonction ne fonctionne pas

+1

La requête ajax est asynchrone. La deuxième alerte s'exécute réellement avant que le 'get' se termine. – avrahamcool

+0

Par seconde 'alert' vous voulez dire d'abord, non? – a0viedo

Répondre

0

En effet, la fonction $.get est asynchrone, vous devez soit des promesses d'utilisation, ou enveloppez la fonction dans votre propre fonction qui prend un rappel comme celui-ci:

function myGet(callback) { 
    $.get("https://ipinfo.io", function(response) { 
     if(response.ip.indexOf(':') > -1){ 
      callback('google.com'); 
     } else { 
      callback ('google.ch'); 
     } 
    }, "jsonp") 
} 

Utilisation:

myGet(function(data) { 
    alert(data); 
}); 
+0

Donc, si je veux synchrone quelle fonction serait-elle? – mazleu

+2

@mazleu - Vous ne voulez pas qu'il soit synchrone. Cela bloque le thread principal et le navigateur peut offrir à l'utilisateur la possibilité de tuer votre script. Organisez l'affichage de l'alerte dans le cadre du traitement de la réponse. –

+0

Votre exemple ne fonctionne pas. Il dit que l'URL n'est pas définie. – mazleu