Вернуть данные метода «success:»? - PullRequest
2 голосов
/ 13 октября 2011

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

function loadFrames(coords, spritesheet) {
    return $.ajax({
        type: "GET",
        url: coords,
        dataType: "xml",
        success: function(xml,code,obj) {return parseFrameData(xml, spritesheet);}
    });
}

Итак, этот метод получает два аргумента, открывает файл (тот, на который указывает "plist"аргумент) и запускает метод parseFrameData.Последний возвращает массив объектов.

Я хотел бы использовать это следующим образом:

var frames = loadFrames('player.xml', 'spritesheet.png');

, но я не нахожу способ сказать «вернуть значение метода»Вы звонили в режиме онлайн, начиная с "'success:'" ...

Ответы [ 2 ]

2 голосов
/ 13 октября 2011

Редактировать: ответ , опубликованный на вопрос @Tomlak, связанный с сообщением мне об этой классной концепции «Обещания», на которую вы также можете взглянуть.

Смысл использования $ .ajax обычно состоит в том, чтобы делать асинхронные запросы.Вызов его и ожидание немедленного возврата значения будет синхронным запросом.

При этом вы можете делать то, что просите, используя $ .ajax в синхронном режиме, установивasync:false.Это может привести к блокировке браузера до завершения запроса.

function loadFrames(coords, spritesheet) {
  var myFrames;

  $.ajax({
    type: "GET",
    url: coords,
    dataType: "xml",
    async: false,
    success: function(xml,code,obj) {myFrames = parseFrameData(xml, spritesheet);}
  });
  return myFrames;
}

var frames = loadFrames('player.xml', 'spritesheet.png');

Я считаю, что это будет работать, но у меня нет хорошего способа проверить это.Кто-нибудь еще может подтвердить этот подход?

Тем не менее было бы гораздо лучше сделать это асинхронно, как подсказывает @Petah.

1 голос
/ 13 октября 2011

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

Как бы то ни было, вы можете передать функции обратный вызов, который будетвызывается после завершения Ajax-запроса.

function loadFrames(coords, spritesheet, callback) {
    $.ajax({
        type: "GET",
        url: coords,
        dataType: "xml",
        success: function(xml,code,obj) { callback(parseFrameData(xml, spritesheet)); }
    });
}

Кроме того, отметим, что для проверки ошибок HTTP, таких как 404 и 500, нужно передать параметр error в ajax call

...