превращение анонимной функции ajax в обычную функцию - область видимости? - PullRequest
4 голосов
/ 04 октября 2011

Я joo / jquery noob и изо всех сил пытался заставить анонимную функцию работать как обычная функция. Может кто-то указать, что я делаю не так?

Вот что заняло у меня несколько часов:

var tracklist = new Array();

function stuffXML(xml) {
    $(xml).find('track').each(function(){
        var logo = $(this).find('logo').text();
        var location = $(this).find('location').text();
        var id = $(this).find('identifier').text();
        var info = $(this).find('info').text();
        var title = $(this).find('title').text();
        var creator = $(this).find('creator').text();

        tracklist.push(logo,location,id,info,title,creator);

    });

    console.log('mid' + tracklist);  //works here
}

$(document).ready(function(){

    $.ajax({
        type: "GET",
        url: "real.xml",
        dataType: "xml",
        success: stuffXML
    });

console.log(tracklist);  //but not here - empty array

});

Я пытаюсь разобрать список (набор изображений и текста для слайд-шоу) в массив (успешно там), а затем сделать их доступными, но моя область видимости слишком ограничена. Я не вижу, что я делаю неправильно, хотя ...

Буду признателен за любую помощь ...

Ответы [ 3 ]

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

Ваша проблема в том, что вы забыли, что означает A в AJAX.Асинхронный.Когда вы запускаете команду для

$.ajax({
    type: "GET",
    url: "real.xml",
    dataType: "xml",
    success: stuffXML
});

, она запускается немедленно, без колебаний и следует немедленно с вашим console.log.В фоновом режиме браузер занят запросом данных и , а затем , добавляя их в переменную треклиста.Итак, что вы хотите сделать, это поместить этот console.log в stuffXML.Конечно, вы, вероятно, хотите делать что-то иное, чем console.log ... так что 'stuffXML' запускает любые другие события, которые вам нужно запустить, чтобы остальная часть вашего кода делала то, что нужно.Просто помните, что веб-сервер не будет обслуживать запрос к вашей странице быстрее, чем javascript собирается перейти к следующей строке кода для выполнения.

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

Массив там пуст, потому что этот код запускается сразу после готовности DOM, но не обязательно (и крайне маловероятно) после завершения XHR.

Чтобы иметь возможность использовать tracklist, вам нужно обратиться к нему внутри функции stuffXML() или в другой функции, у которой трассировка стека имеет предка stuffXML().

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

Когда вы вызываете console.log() в функции готовности документа, маловероятно, что запрос Ajax будет выполнен: обратный вызов происходит в конце запроса Ajax;вызов готового документа произойдет сразу после отправки запроса.

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