2011-05-25 41 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

相关问题