2017-07-09 1 views
0

Je rencontre un problème avec la portée d'une variable. Je dois pouvoir accéder à "userLocation" en dehors de "request". Le paquet de demande se trouve à https://github.com/request/request Voici mon code ci-dessous:Problème d'étendue (NodeJS - package "request")

var request = require('request'); 
var userLocation = ""; 
request('http://ipinfo.io', function(error, res, body) { 
    var ipDetails = JSON.parse(body); 
    userLocation = ipDetails.loc; 
}); 
console.log(userLocation); 

Lorsque je tente de sortir la variable « userLocation », elle imprime une chaîne vide au lieu des détails de l'ensemble de la demande.

Répondre

1

Ce n'est pas un problème de portée. La nature de NodeJS est asynchrone, ce qui signifie que console.log(userLocation) n'attendra pas que votre request soit terminé avant d'être exécuté. C'est pourquoi les promesses et les fonctions de rappel existent.

Si vous souhaitez imprimer userLocation, déplacer à l'intérieur de la fonction de rappel comme ceci:

var request = require('request'); 
var userLocation = ""; 
request('http://ipinfo.io', function(error, res, body) { 
    var ipDetails = JSON.parse(body); 
    var userLocation = ipDetails.loc; 
    console.log(userLocation); 
}); 

Jetez un oeil à ce awesome tutorial si vous souhaitez en savoir plus.

+0

Salut, merci pour la réponse. Que faire si j'ai besoin d'assigner la valeur de "request" à une variable en dehors de la fonction de requête? – dnesbeth

+0

Est-ce qu'une promesse fonctionnerait pour vous? nouvelle Promesse ((res, rej) => {var résolution = function (myReqValue) { res (myReqValue);} demande ('http://ipinfo.io', fonction (erreur, res , corps) {var ipDetails = JSON.parse (corps); var userLocation = ipDetails.loc; détermination (userLocation); });. }) puis ((res) => { console.log ("Userlocation:" + res) }); – midnightsyntax

+0

@midnightsyntax merci! Cela a fonctionné parfaitement. – dnesbeth