Как вернуть переменную из $ .post () в jQuery? Закрытие переменной? - PullRequest
2 голосов
/ 20 мая 2010

У меня проблемы с передачей данных, извлеченных из функции $ .post (), для использования в других местах моего кода. Я хочу сохранить данные как переменную и использовать их вне функции post (). Это мой код:

var last_update = function() {
$.post('/--/feed',
{func:'latest', who:$.defaults.login},
function($j){
            _j = JSON.parse($j);    
            alert(_j.text); // This one works    
        });
}
alert(_j.text); // This one doesn't
};

last_update(); //run the function

Пожалуйста, помогите!

Ответы [ 4 ]

3 голосов
/ 20 мая 2010

AJAX-вызов $.post() является асинхронным - это означает, что запрос AJAX выполняется не по порядку обычного выполнения программы, а в вашей программе это означает, что второе предупреждение вызывается до заполнения _j. Порядок исполнения:

  1. вызов last_update ()
  2. сделать запрос ajax, не забудьте выполнить функцию обратного вызова, но не сейчас
  3. вызвать второе оповещение (_j.text);
  4. когда запрос ajax возвращает данные, выполните функцию обратного вызова

Переместите код, который использует данные возврата AJAX, в функцию success() (здесь ваша функция возврата function($j)) - для этого предназначена функция успеха.

$.post() - это псевдоним для $.ajax() - полные документы здесь .

1 голос
/ 20 мая 2010

Если вы хотите получить доступ к значению данных вне обратного вызова ajax-запроса, вам нужно будет поместить этот код в функцию и вызвать его из обратного обратного вызова.

var last_update = function() {
$.post('/--/feed',
{func:'latest', who:$.defaults.login},
function($j){
            _j = JSON.parse($j);    
            alert(_j.text); // This one works   
            someOtherFunc(_j.text); 
        });
}
};

last_update(); //run the function

function someOtherFunc(val) {
    alert(val)
}

По сути то же самое, что и размещение кода в обратном вызове, но может быть полезно, если у вас есть немного кода, который повторно используется в другом месте.

0 голосов
/ 20 мая 2010

Вы можете сделать свой POST-запрос синхронным и иметь глобальную переменную _j:

// global!!!
var _j;

$.ajax({
  async: false,
  url: '/--/feed',
  data: { func:'latest', who:$.defaults.login },
  success: function($j) {
    _j = JSON.parse($j);    
    alert(_j.text); // This one works
  }
});

function last_update() {
  if (typeof _j != 'undefined') {
    alert(_j);
  }
}

Или вы можете просто вызвать last_update () из вашего обратного вызова, поэтому больше не требуется асинхронность:

$.ajax({
  url: '/--/feed',
  data: { func:'latest', who:$.defaults.login },
  success: function($j) {
    _j = JSON.parse($j);    
    alert(_j.text); // This one works
    last_update(_j);
  }
});

function last_update(_j) {
    alert(_j);
}
0 голосов
/ 20 мая 2010

Создать _j в области действия функции last_update.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...