Повторно свяжите вызов AJAX с исходным URL-адресом, используя jQuery. - PullRequest
1 голос
/ 20 ноября 2010

Я не уверен, как вообще объяснить это, что делает поиск очень трудным (особенно потому, что я уверен, что это ошибка в мышлении).

У меня есть массив объектов:

var a = [
    {
        url: "http://www.discusionboard.com/list-of-boards/", 
        name: "Discussion Board One", 
        threads: []
    },
    {url: "...", name: "...", threads: [] }
]

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

for( var i = 0; i < a.length; i++ ) {
    jQuery.get(a[i].url, function(result, status, xhr) {
        /* result is list of threads separated by "[SPLIT]" */
        a[i].threads = result.split("[SPLIT]")
    });
}

Моя проблема,то есть то, что «i» в [i] .threads не определено.Я не могу найти способ передать его в функцию, и это заставляет меня думать, что я просто фундаментально неправильно понимаю основную концепцию здесь.

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

1 Ответ

1 голос
/ 20 ноября 2010

Это хороший пример проблемы замкнутого цикла. Функция обратного вызова, которую вы передаете в jQuery, выполняется только после завершения цикла (даже после того, как функция, внутри которой она находится, возвращает значение). Следовательно, a[i] (для функции обратного вызова) всегда будет последним элементом массива. jQuery.ajax обеспечивает настройку context для решения этой проблемы:

for( var i = 0; i < a.length; i++ ) {
    jQuery.ajax({
        url: a[i].url,
        context: a[i],
        success: function(result, status, xhr) {
            /* result is list of threads separated by "[SPLIT]" */
            this.threads = result.split("[SPLIT]")
        }
    });
}

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

var numRequests = a.length;

И это в конце функции обратного вызова:

if(!--numRequests) {
    // Do whatever now that all object data has been loaded.
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...