2014-04-02 5 views
0

Я с этой проблемой с помощью следующего кода: http://jsfiddle.net/double0seven/z3Yr4/Javascript функции в замыкании функции

var feedurl = "https://itunes.apple.com/nl/rss/topsongs/limit=25/xml"; 
var j, i, x; 
$.getJSON("http://ajax.googleapis.com/ajax/services/feed/load?q=" + feedurl + "&v=1.0&num=-1&callback=?", function(data) { 
    for (j = 0; j < 21; j += 1) { 
     qt = j + ". " + data.responseData.feed.entries[j].title.replace('#', ''); 
     console.log(qt); 
     li = $("<li/>").html(qt).appendTo('#ul1'); 
     $.getJSON("http://gdata.youtube.com/feeds/api/videos?q=" + qt + "&v=2&start-index=1&max-results=1&orderby=relevance&format=5&alt=jsonc&callback=?", (function(el) { 
      return function(videoFeed) { 
       for (i = 0; i < videoFeed.data.items.length; i += 1) { 
        entry = videoFeed.data.items[i]; 
        track = qt; 
        var liid = liid += 1; 
        el.empty(); 
        el.addClass("item"); 
        el.attr('id', i); 
        el.attr('ytid', entry.id); 
        el.attr('titel', entry.title); 
        newdiv = $(document.createElement("div")); 
        newdiv.addClass("mod"); 
        newdiv.append("<h3>" + qt + "<br></h3>"); 
        el.append(newdiv); 
       } 
      }; 
     }(li))); 
    } 
}) 

Вот что нужно сделать:

  1. получить заголовки из RSS-канала (работа)
  2. поместите их (до макс. 20) в неупорядоченный список - примечание, упорядоченное по nr. (работы)
  3. поиска для каждого заголовка хорошего видео на YouTube API (работа)
  4. поместить некоторую информацию в созданном ли (работах) (ytid нормально и так это название)
  5. тем он должен получить переменную qt от внешней/материнской функции, чтобы пойти с ней. Однако - это всегда получает последнюю заполненный СПОКОЙНЫЕ переменный в строке ...

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

Благодарим за помощь.

ответ

0

Что происходит, так это то, что qt-ссылка обновляется каждую итерацию в вашем внешнем цикле, и когда первый Ajax-ответ на API Youtube завершен, внешний цикл уже достиг цели.

Вам необходимо будет сохранить каждую qt-ссылку с каждым внутренним запросом Ajax, чтобы запросы обновили соответствующий LI.

Самый простой способ сделать это, чтобы создать функцию, которая возвращает функцию, которая использует параметр внешней функции:

var renderLi = function (qt, el) { 
    return function(videoFeed) { 
     ... 
    }; 
}; 

... 

$.getJSON("http://gdata.youtube.com/feeds/api/videos?q=" + qt + "&v=2&start-index=1&max-results=1&orderby=relevance&format=5&alt=jsonc&callback=?", renderLi(qt, li)); 

http://jsfiddle.net/z3Yr4/24/

+0

Великий объяснение и решение! – Double0Seven

Смежные вопросы