jQuery (междоменный) .getJSON, хранить ответ в переменной многократного использования - PullRequest
1 голос
/ 04 октября 2010

Я хочу получить IP от текущего пользователя и отправить его вместе с AJAX POST в PHP файл.Это означает, что мне нужно повторно использовать переменную, полученную в ответе на запрос IP .getJSON.

Скрипт 1: Я нашел этот удобный фрагмент в snipt :

$.getJSON("http://jsonip.appspot.com?callback=?",function(data){
    alert( "Your ip: " + data.ip);
});

Сценарий 1 работает и выдает предупреждение с вашим IP .

Сценарий 2: I

 var ipAppspot;
 $.getJSON("http://jsonip.appspot.com?callback=?",function(data){
         ipAppspot = data.ip;
 });
 alert(ipAppspot);

script 1 преобразовал в это: Как я понимаю, отсутствие объявления ключевого слова 'var' перед переменной делает его доступным для всех областей, дажевне функции (глобально) .Хотя я думаю, что это должно работать, если script 2 не будет междоменным запросом, может быть, но в этом случае он выдает диалоговое окно с предупреждением 'undeifined' Так чтохотя пример не будет работать

Вкл Stackoverflow есть еще один вопрос jQuery-storing-ajax-response-into-global-variable , который имеет дело с примернота же проблема.

И добавляя решение, которое они дают, я получаю следующее.

Скрипт 3: Добавление решения по ссылке

// /703971/jquery-hranenie-otveta-ajax-v-globalnuy-peremennuy
var ipStore = (function(){
    var ipAppspot;
    $.getJSON("http://jsonip.appspot.com?callback=?",function(data){ipAppspot = data.ip;});
    return {getIp : function()
    {
        if (ipAppspot) return ipAppspot;
        // else show some error that it isn't loaded yet;
    }};
})();

alert(ipStore.getIp());

Сценарий 3 Дает ту же проблему, что и Сценарий 2 , то есть 'undefined'

Вопрос: Как можноЯ повторно использую эту переменную в дальнейшем использовании в моем сценарии?

РЕДАКТИРОВАТЬ для ответа Ника Крейвера

var ipAppspot;
$.getJSON("http://jsonip.appspot.com?callback=?",function(data){
  ipAppspot = data.ip;
  myFunc();       
});
function myFunc() {
  alert(ipAppspot);
}

Ника Крейвера , которыйна самом деле работает.

function dataAuth(ip){      
    // collect data from form
    var usernameRaw = $('#feg-username').val();
    var passwordRaw = $('#feg-password').val();
    // phpFile is our back-endgine
    var phpFile = 'feg/back-endgine.php';
    // construct the JSON in a variable
    var dataConstruct   = "username=" + usernameRaw + "&password=" + passwordRaw + "&ip=" + ip;
    // start the AJAX 
    $.ajax({
       type: "POST",
       url: phpFile,
       dataType: "json",
       data: dataConstruct,
       success: function(msg){
         alert(msg);
       }
     });
} // END dataAuth

Это в моем приложении, и я бы использовал функцию следующим образом:

$('body').delegate('#feg-submit', 'click', function(){
    $(this).attr('disabled','disabled');
    console.log('submit button clicked');
    dataAuth(ipAppspot);
    return false
});

Так что я бы использовал ipAppspotтам, и мне понадобится IP для запросов AJAX позже, есть ли способ, которым я мог бы реализовать это?

Ответы [ 3 ]

3 голосов
/ 04 октября 2010

Это не проблема области видимости, это проблема синхронизации, давайте проиллюстрируем это на примере, который работает , например:

var ipAppspot;
$.getJSON("http://jsonip.appspot.com?callback=?",function(data){
  ipAppspot = data.ip;
  myFunc();       
});
function myFunc() {
  alert(ipAppspot);
}

Вы можете проверить это здесь.Обратите внимание: предупреждает ваш IP, так что здесь отличается?Вы не запрашиваете переменную (вызывая alert()), пока переменная не будет заполнена, и это происходит в обратном вызове $.getJSON().Таким образом, область не является проблемой, но тот факт, что обратный вызов запускается позже (когда ответ возвращается) является проблемой, просто инициируйте все, что нужно для данных из обратного вызова,поскольку данные доступны впервые.

Ниже приведен более распространенный пример передачи данных непосредственно туда, куда они идут:

$.getJSON("http://jsonip.appspot.com?callback=?",function(data){
  myFunc(data.ip);
});
function myFunc(ipAppspot) {
  alert(ipAppspot);
}

Или короткая версия:

$.getJSON("http://jsonip.appspot.com?callback=?", myFunc);
function myFunc(ipAppspot) {
  alert(ipAppspot);
}
1 голос
/ 04 октября 2010

Ваше оповещение появляется до завершения асинхронной операции и поэтому не определено в это время.Если вы поместите предупреждение в обратный вызов, вы обнаружите, что оно (вероятно) правильно определено.Если вы хотите назначить и повторно использовать переменную, не пытайтесь делать это, пока не сработает обратный вызов.Возможно, логика, которая требует этого значения, может быть помещена в функцию, которая вызывается из обратного вызова?

0 голосов
/ 04 октября 2010

Ajax является асинхронным. Рефакторинг, так что вы делаете условия в обратном вызове.

Это или сделать асинхронным ложным.

...