从$ .POST返回值

时间:2018-11-02 15:38:44

标签: javascript jquery ajax post return-value

当我用console.log(ip2db())调用函数时,它会打印undefined。我如何返回从ip2db.php返回的值?

这是我的代码:

function ip2db(){
    var result;
    $.getJSON('https://api.ipgeolocation.io/ipgeo?apiKey=a759dab4af1f462496dda90b3575f7c7', function(data) { 
        var ip_data = JSON.stringify(data, null, 2);
        $.post("https://mywebsite.com/ip2db.php",
            {
                ip_data
            },
            function(data, status){
                console.log("data: " + data + "\nStatus: " + status);
                CreateUserStorage(data);
                result = data;
            }
        );   
    });
    return result;
}

2 个答案:

答案 0 :(得分:2)

ajax呼叫是同步呼叫,因此您将永远不会得到响应。 有两个选项: -传递回调 -使用承诺

  • await - async,但这个问题题外话

因此,在您发布的这个示例中,您应该这样做:

function ip2db(your_callback){
    var result;
    $.getJSON('https://api.ipgeolocation.io/ipgeo?apiKey=a759dab4af1f462496dda90b3575f7c7', function(data) { 
        var ip_data = JSON.stringify(data, null, 2);
        $.post("https://mywebsite.com/ip2db.php",
            {
                ip_data
            },
            function(data, status){
                console.log("data: " + data + "\nStatus: " + status);
                CreateUserStorage(data);
                result = data;
                your_callback(result)
            }
        );   
    });
}

您这样称呼它:

ip2db(function(result) {
    console.log(result);
})

答案 1 :(得分:1)

Tahtakafa,http方法是异步方法,这意味着它们不会像您在上面提供的代码中所期望的那样继续处理其余代码。因此,当您执行ip2db时,函数末尾的result值仍未定义。但是,当来自服务器的响应到达时,该值已正确设置。因此,为了获得正确的值,您需要了解js中的异步流。

要解决您的问题,有几种选择,但是您需要了解的一件事是尝试了解js中的异步操作。

  1. 解决方案1:使用Promise检测响应何时到来,然后您可以对此采取行动,

function ip2db(){
   return new Promise(function(resolve, reject){
      $.getJSON('https://api.ipgeolocation.io/ipgeo?apiKey=a759dab4af1f462496dda90b3575f7c7', function(data) { 
          var ip_data = JSON.stringify(data, null, 2);
          $.post("https://mywebsite.com/ip2db.php",
              {
                  ip_data
              },
              function(data, status){
                  console.log("data: " + data + "\nStatus: " + status);
                  CreateUserStorage(data);
                  result = data;
              }
          );   
      });
   });
}

//use it like this
ip2db().then(function(){
});

  1. 对于解决方案2,您只需要保留代码原样,但不要期望输出是http调用的结果值。像这样:

function ip2db(){
  $.getJSON('https://api.ipgeolocation.io/ipgeo?apiKey=a759dab4af1f462496dda90b3575f7c7', function(data) { 
        var ip_data = JSON.stringify(data, null, 2);
        $.post("https://mywebsite.com/ip2db.php",
            {
                ip_data
            },
            function(data, status){
                console.log("data: " + data + "\nStatus: " + status);
                CreateUserStorage(data);
                // make use of result here to do any logic you might want to do
            }
        );   
    });
}