Возвращаемое значение из $ .POST - PullRequest
0 голосов
/ 02 ноября 2018

Когда я вызываю функцию с 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 голосов
/ 02 ноября 2018

Tahtakafa, методы http являются асинхронными, то есть они не продолжают передаваться вместе с остальным кодом, как вы ожидаете в приведенном выше коде. Таким образом, когда вы выполняете ip2db, значение result в конце функции все еще не определено. Однако, когда приходит ответ от сервера, значение устанавливается правильно. Поэтому, чтобы получить правильное значение, вам нужно понять асинхронный поток в js.

Для решения вашей проблемы есть несколько вариантов, но вам нужно знать одну вещь - попытаться понять асинхронные операции в js.

  1. Решение № 1: используйте обещания, чтобы определить, когда приходит ответ, и затем вы можете действовать по нему, например,

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
            }
        );   
    });
}
0 голосов
/ 02 ноября 2018

вызов 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);
})
...