0

I am new to JS and want to create a function that receives a given IP address and returns some information about it

function getDadoIP(IP){
  var APIKey = 'key';
  var format = 'json';
  var url = 'http://api.ipinfodb.com/v3/ip-city/?key=' + APIKey + '&ip=' + IP + '&format=' + format + '&callback=?';
  var resposta = $.getJSON(url); 

  resposta.then(function (res) {
    var info = '';

    for (var chave in res) {
      info += res[chave] + ',';
    }
    console.log(info);
    var dado = info.split(/,/);

    return {
      "codigoStatus": dado[0],
      "codigoMensagem": dado[1],
      "ipPesquisado": dado[2],
      "codigoPais": dado[3],
      "pais": dado[4],
      "regiao": dado[5],
      "cidade": dado[6],
      "codigoZip": dado[7],
      "latitude": dado[8],
      "longitude": dado[9],
      "fusoHorario": dado[10]
    };
  });
}

function setup() {
  var dados = getDadoIP('IP-goes-here');
  console.log(dados);
}

I am able to get the inormation I want in the function, as console.log(info) displays what I expected. However, the returned value is undenfined, as evidenced by console.log(dados). Would appreciate any help.

arquelau
  • 39
  • 1
  • 11
  • Ask yourself the question: "_Which_ function is returning something?", then look for all instances of `function`. Then go read up about async javascript :) – Alex McMillan Oct 04 '17 at 00:35

2 Answers2

2

You have no return statement inside of getDadoIP, so it's implicitly returning undefined. You'll need to return the promise object, and then use it's .then method to access the final value.

 function getDadoIP(IP){
   var APIKey = 'key';
   var format = 'json';
   var url = 'http://api.ipinfodb.com/v3/ip-city/?key=' + APIKey + '&ip=' +      IP + '&format=' + format + '&callback=?';
   var resposta = $.getJSON(url); 

   //** Added return statement
   return resposta.then(function (res) {
     var info = '';

     for (var chave in res) {
       info += res[chave] + ',';
     }
     console.log(info);
     var dado = info.split(/,/);

     return {
       "codigoStatus": dado[0],
       "codigoMensagem": dado[1],
       "ipPesquisado": dado[2],
       "codigoPais": dado[3],
       "pais": dado[4],
       "regiao": dado[5],
       "cidade": dado[6],
       "codigoZip": dado[7],
       "latitude": dado[8],
       "longitude": dado[9],
       "fusoHorario": dado[10]
     };
   });
 }

 function setup() {
   //** added .then
   getDadoIP('IP-goes-here')
     .then(function (dados) {
       console.log(dados);
     });
  }
Nicholas Tower
  • 72,740
  • 7
  • 86
  • 98
0

With async/await:

async function getDadoIP(IP){
  var APIKey = 'key';
  var format = 'json';
  var url = 'http://api.ipinfodb.com/v3/ip-city/?key=' + APIKey + '&ip=' + IP + '&format=' + format + '&callback=?';
  var res = await $.getJSON(url); 

  var info = '';

  for (var chave in res) {
    info += res[chave] + ',';
  }
  console.log(info);
  var dado = info.split(/,/);

  return {
    "codigoStatus": dado[0],
    "codigoMensagem": dado[1],
    "ipPesquisado": dado[2],
    "codigoPais": dado[3],
    "pais": dado[4],
    "regiao": dado[5],
    "cidade": dado[6],
    "codigoZip": dado[7],
    "latitude": dado[8],
    "longitude": dado[9],
    "fusoHorario": dado[10]
  };
}

async function setup() {
  var dados = await getDadoIP('IP-goes-here');
  console.log(dados);
}
Isaac
  • 11,409
  • 5
  • 33
  • 45