2012-09-04 6 views
1

На данный момент я интегрировал API Last.fm на своем сайте www.midnightlisteners.com, но он помещает все данные Last.fm на последнем Kanye West. Если вы наведите указатель мыши на значок (i), вы увидите, что данные появляются в подсказке.Last.fm API jQuery

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

Мой код JQuery:

$(document).ready(function() { 
     // Find Related Artists based on Last.fm JSON Results 
     $(".artist-data").each(function() { 
      // Find the artist name in the "p" tag and save it 
      artistName = $(this).find(".artist-wrap-mid p"); 
      artist = artistName.text(); 
      // Create a class out of the artist name made of lowercase letters and "-" instead of spaces 
      artistClass = artist.toLowerCase().replace(/ /g, '-'); 
      // Add this class to the .artist-data div 
      $(this).addClass(artistClass); 

      // Check if a value is present 
      if (artist === '') { 
       $("." + artistClass + " .related").html("No related artist info found for " + artist); 
      } 
      // Otherwise return the request with links to each related artist 
      else { 
       $.getJSON("http://ws.audioscrobbler.com/2.0/?method=artist.getsimilar&artist=" + artist + "&api_key=9c991c10bf461ac4e4f92fdfa14c20c2&limit=3&format=json&callback=?", function(data) { 
        var html = ''; 
        $.each(data.similarartists.artist, function(i, item) { 
         html += "<a href='http://" + item.url + "' target='_blank'>" + item.name + "</a>, "; 
        }); // End each 
        $("." + artistClass + " .related").append(html); 
       }); // End getJSON  
      } // End Else 
     }); 
}); 

Мой HTML лучше всего видно на моем сайте: www.midnightlisteners.com

Но он помещает все данные из Last.fm, чтобы <div class="related"> </div>

Я получил тонны помощи здесь: writing.sackettsolutions.com/2012/02/navigating-the-last-fm-api-with-a-little-help-from-jquery-getjson

ответ

3

Это общая проблема. Речь идет о циклах, которые содержат асинхронные вызовы с обратными вызовами. Цикл будет работать очень быстро и очень быстро создаст все вызовы $ .getJSON(). К моменту завершения обратных вызовов цикл завершается, поэтому область закрытия обратного вызова будет содержать только ссылку на данные последнего цикла цикла.

Решение: Ослабьте контур ... только начните следующий цикл цикла ПОСЛЕ того, как предыдущий завершил обратный вызов. Поэтому вместо запуска фиксированного цикла .each() вам придется увеличивать индекс внутри обратного вызова и запускать следующий цикл цикла «вручную».

EDIT 2: Ваш код должен быть что-то в линиях (! Непроверенных)

var currIndex = 0; 
var $currArtists = $('.artist-data'); 

if($currArtists.length > 0) getNextArtistInfo(); 

function getNextArtistInfo() { 
    // get reference to current artist 
    var $currArtist = $currArtists.eq(currIndex); 
    artistName = $currArtist.find(".artist-wrap-mid p"); 
    artist = artistName.text(); 
    // Create a class out of the artist name made of lowercase letters and "-" instead of spaces 
    artistClass = artist.toLowerCase().replace(/ /g, '-'); 
    // Add this class to the .artist-data div 
    $currArtist.addClass(artistClass); 

    // Check if a value is present 
    if (artist === '') { 
      $("." + artistClass + " .related").html("No related artist info found for " + artist); 
      currIndex++; 
      if(currIndex < $currArtists.length) 
       getNextArtistInfo(); 
    } 
      // Otherwise return the request with links to each related artist 
    else { 
     $.getJSON("http://ws.audioscrobbler.com/2.0/?method=artist.getsimilar&artist=" + artist + "&api_key=9c991c10bf461ac4e4f92fdfa14c20c2&limit=3&format=json&callback=?", function(data) { 
      var html = ''; 
      $.each(data.similarartists.artist, function(i, item) { 
       html += "<a href='http://" + item.url + "' target='_blank'>" + item.name + "</a>, "; 
      }); // End each 
      $("." + artistClass + " .related").append(html); 
      currIndex++; 
      if(currIndex < $currArtists.length) 
       getNextArtistInfo(); 
     }); 
    } 
} 
+0

Спасибо, могли бы вы, возможно, помочь мне с этим? Я действительно новичок в jQuery. Я только начал читать jQuery новичка в книге ниндзя: D – Pullapooh

+0

см. EDIT выше ... – devnull69

+0

Как мне это реализовать в моем коде? – Pullapooh