当我用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;
}
答案 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中的异步操作。
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(){
});
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
}
);
});
}