получение URL-адреса с использованием $ .getJSON и его правильный анализ - PullRequest
2 голосов
/ 17 апреля 2010

Возможно, это действительно глупо, но я не могу найти проблему с моим кодом. Он получает URL-адрес, который возвращает json, а затем функция должна вернуть строку:

function getit() {
  var ws_url = 'example.com/test.js';
  var user = false;

  $.getJSON(ws_url, function(data) {
    alert('user '+data.user);//shows john
    user = data.user || false;
  });

  return user;//should return john but returns false
}

test.js будет выглядеть примерно так:

{"id":"12","username":"ses","user":"john","error":""}

или как это:

{"error":"123"}

Я тоже пытался if (data.user) {} else {}, но он тоже не работал ..

Так чего мне не хватает?

Спасибо:)

Ответы [ 2 ]

4 голосов
/ 17 апреля 2010

Проблема связана с тем, что вызов $.getJSON() является асинхронным. Как только запрос ajax запущен, обработка продолжается внутри getit(), и ваша функция немедленно возвращает false. Позже, ответ Ajax возвращает и устанавливает user, но ваша getit() функция return издана давно!

Вы можете заставить Ajax-вызов быть синхронным, используя опцию async, например:

  $.ajax({
    async: false,
    url: ws_url,
    type: "GET",
    success: function(data) {
        alert('user '+data.user);//shows john
        user = data.user || false;
    }
  });

Если вы сделаете это, ваш браузер будет блокировать скрипт до тех пор, пока не будет возвращен вызов Ajax. Как правило, это не идеальное поведение (именно поэтому по умолчанию установлено значение async: true), поэтому я бы предложил переработать все, что бы оно ни называло getit(), и ожидать, что оно будет обрабатывать результаты в любое время, возможно, путем это собственная функция обратного вызова для getit(), которая затем будет выполнена, когда будет getit().

2 голосов
/ 17 апреля 2010

Ajax является асинхронным, что означает, что остальная часть сценария не собирается сидеть сложа руки и ждать, пока он завершится, прежде чем двигаться дальше. Как и в вашем примере, строка return достигается до того, как функция ajax получает ответ от сервера, поэтому пользовательская переменная все еще имеет значение false в этот момент времени.

Если вы хотите, чтобы ajax-вызов выполнялся синхронно, вы можете использовать метод jQuerys $. Ajax и установить для параметра async значение false.

$.ajax({
  url:ws_url,
  dataType:"json",
  async:false,
  success:function(data){
    alert('user '+data.user);//shows john
    user = data.user || false;
  }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...