函数返回对象,但得到'undefined'

时间:2017-10-04 00:31:15

标签: javascript

我是JS的新手,想要创建一个接收给定IP地址并返回一些相关信息的函数

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

我能够在函数中得到我想要的信息,因为console.log(info)显示了我的预期。但是,返回的值为undenfined,由console.log(dados)证明。非常感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

getDadoIP内部没有return语句,因此隐式返回undefined。您需要返回promise对象,然后使用它的.then方法来访问最终值。

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

答案 1 :(得分:0)

使用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);
}