Как сохранить возвращенное значение $ .getJSON в JQuery - PullRequest
3 голосов
/ 05 августа 2009

Я делаю приложение, которое использует JQuery и Cakephp.

В этом я использую как следующие, чтобы получить значения со стороны моего контроллера

var getformid;
$.getJSON("http://localhost/FormBuilder/index.php/forms/getFormEntry", function(json) {
  getformid=json.forms[0]["id"];
  alert("Form id inside "+getformid);
});//json 

alert("Form id ouside "+getformid);

В приведенном выше коде внутреннее предупреждение внутри $ .getJSON дает мне правильное значение 75 Но внешнее предупреждение, показывающее мне ошибку как getformid, не определено. Почему так? Не можем ли мы использовать getformid, доступный за пределами $ .getJSON. ..

Edit: Если я пытаюсь использовать код как

var getformid;    
$.getJSON("http://localhost/FormBuilder/index.php/forms/getFormEntry", myCallback);

function myCallback (json) {
  getformid = json.forms[0]["id"];

  // You can work with the response here
}

Я получаю сообщение об ошибке типа myCallback не определено. Почему так ?? Также я должен использовать значение getformid вне функции myCallback ()

Ответы [ 3 ]

6 голосов
/ 05 августа 2009

Вы должны подождать, пока $.getJSON не вернет значение, прежде чем начать его использовать. Так что если вы делаете:

var test;
$.getJSON('url', function(data) {
    test = data;
});

alert(test); // you will get undefined here

Это предупредит неопределенное, потому что JS не ждет, пока $.getJSON завершит получение данных (AJAX по определению асинхронный), и предупреждение будет вызвано, когда тест еще не инициализирован.

Что вам, вероятно, следует сделать, это обернуть ваш «внешний» код в какую-то функцию и вызвать эту функцию из $.getJSON обратного вызова.

var test;
$.getJSON('url', function(data) {
    test = data;
    showAlert(); // this call will display actual value
});

function showAlert() {
    alert(test);
}
2 голосов
/ 05 августа 2009

Как говорили другие $.getJSON вызов асинхронный и не завершился вовремя для внешнего оповещения.

Если вы хотите, чтобы функция оповещения была синхронной, вы можете сделать это,

var getformid;

$.ajax({
    async: false, // This will make call synchronous
    url: "http://localhost/FormBuilder/index.php/forms/getFormEntry",
    dataType: "json",
    success:  function(json) {
        getformid=json.forms[0]["id"];
        alert("Form id inside "+getformid);
        }
 });//json 

alert("Form id ouside "+getformid);

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

0 голосов
/ 05 августа 2009

Обратный вызов getJSON выполняется асинхронно, когда запрос завершается, вы должны работать со значением в обратном вызове, если вам не нравится иметь функцию обратного вызова внутри вызова getJSON, вы можете объявить функцию и обработайте свою логику там:

$.getJSON("http://localhost/FormBuilder/index.php/forms/getFormEntry", myCallback);

function myCallback (json) {
  var formId = json.forms[0]["id"];
  // You can work with the response here
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...