2011-05-25 58 views
0
// variables to be used throughout 
var videos = new Array(); 

// similar artist/bands 
function similarTo(who) { 
    $.getJSON('http://ws.audioscrobbler.com/2.0/?method=artist.getsimilar&artist='+who+'&limit=20&api_key=b25b959554ed76058ac220b7b2e0a026&format=json&callback=?', function(data) { 
     $.each(data , function(i,similars) { 
      $.each(similars.artist, function(c, artist) { 
       $.getJSON('http://gdata.youtube.com/feeds/api/videos?q='+artist.name+'&orderby=relevance&start-index=1&max-results=1&v=2&alt=json-in-script&callback=?', function(data) { 
        $.each(data.feed.entry, function(i,video) { 
         videos.push({ 
          id: video.id.$t.split(":")[3], 
          title: video.title.$t 
         }); 
        }); 
       }); 
      }); 
      initPlaylist(); 
     }); 
    }); 
} 

// start the playlist 
function initPlaylist() { 
    $('#ytplayerid').load('includes/ytplayer.php?track=' + videos[currenttrack].id); 
    $('#player span').html(videos[currenttrack].title); 
} 

後,當我的代碼到達initPlaylist()功能的視頻陣列顯示爲空,我有一種感覺自己居然被解僱之前$.getJSON()來電顯示爲空... 這可能嗎?如果我在每個push()之後添加一個console.log(視頻),該陣列實際上正在構建。爲什麼我的數組調用函數時,該陣列是內置的JS

+2

我認爲這是一個範圍的問題。視頻被定義在哪裏? – thedaian 2011-05-25 15:33:21

回答

2
$.each(similars.artist, function(c, artist) { 
    // doing ajax stuff here 
    $.getJSON('url', function(data) { 
     // this will get called later 
     $.each(data.feed.entry, function(i,video) { 
      videos.push({ 
       id: video.id.$t.split(":")[3], 
       title: video.title.$t 
      }); 
     }); 
    }); 
}); 
// trying to manipulate ajax data now :(
initPlaylist(); 

你的videos是空的,因爲你試圖在它準備好之前操縱它。

你想要做的是使用jQuery 1.5 +遞延對象

var ajaxs = $.map(similars.artist, function(artist, c) { 
    return $.getJSON('url', function(data) { 
     $.each(data.feed.entry, function(i,video) { 
      videos.push({ 
       id: video.id.$t.split(":")[3], 
       title: video.title.$t 
      }); 
     }); 
    }); 
}); 
// when all the ajaxs finish then call init play list 
$.when.apply($, ajaxs).then(initPlaylist); 
+0

嘿,男士,非常感謝您的迴應,它做到了訣竅......現在,我只需要回去了解上述工作原理和方式:) – 2011-05-25 16:29:25

1

移動initPlaylistvideos存在一個觀點:

function similarTo(who) { 
$.getJSON('http://ws.audioscrobbler.com/2.0/?method=artist.getsimilar&artist='+who+'&limit=20&api_key=b25b959554ed76058ac220b7b2e0a026&format=json&callback=?', function(data) { 
    $.each(data , function(i,similars) { 
     $.each(similars.artist, function(c, artist) { 
      $.getJSON('http://gdata.youtube.com/feeds/api/videos?q='+artist.name+'&orderby=relevance&start-index=1&max-results=1&v=2&alt=json-in-script&callback=?', function(data) { 
       var videoes = []; //create array 
       $.each(data.feed.entry, function(i,video) { 
        videos.push({ 
         id: video.id.$t.split(":")[3], 
         title: video.title.$t 
        }); 
       }); 
       initPlaylist(); 
      //videos exists, but i think you might need to pass it as a parameter 
      }); 
     }); 
    }); 

}); 
} 

雖然,知道在initPlaylist();什麼是可能的幫助。它可能會解決你的代碼中出現的範圍問題。

ALSO:Ajax是異步的,當代碼到達initPlaylist();時,可能不會完成,所以當所有ajax調用完成時,您需要某種類型的回調來調用initPlaylist();

+0

這會導致每次將視頻添加到視頻陣列時都調用initPlaylist。它只需要發生一次,那是陣列完成時的情況。哦,視頻數組是在函數之外聲明的。 – 2011-05-25 15:36:39

+0

@ Cody.Stewart,你有一個範圍問題。 initPlaylist()函數是什麼? – Neal 2011-05-25 15:37:11

+1

更多彎頭油脂。解釋整個Ajax是異步的。 – Raynos 2011-05-25 15:39:47

相關問題