Javascript从json调用返回数据(使用LastFM)

时间:2013-11-21 21:49:22

标签: javascript last.fm

我正在使用这个LastFM包装器插件(https://github.com/fxb/javascript-last.fm-api)。我想要做的是在成功函数之后返回结果。

var getTopTracks = function(){
    var last_fm;

    last_fm = new LastFM({
       apiKey    : //apikey,
       apiSecret : //apiSecret
    });

    last_fm.user.getTopTracks({
        user   : //lastfm username
        period : //track period
        limit  : //track count
    }, {
       success: function( data ){
          var track_arr;
          track_arr = data.toptracks.track;

         // HOW DO I RETURN THE TRACKARRAY TO USE LATER??
       },
         error: function( code, message ){}
       });
};    


// I would like to do something like
// that would output the results (track_array) from the success function inside getTopTracks
var result = getTopTracks();

//编辑

最终我想做的是:

1)遍历用户名数组

2)获取每个lastFM用户名(这是一个数组)的顶部曲目

3)将每个数组中的所有项组合成一个新数组

4)输出到DOM

var user_list = [
   // array of last fm usernames
];

var getTopTracks = function( user, callback ){
    var last_fm;

    last_fm = new LastFM({
       apiKey    : //apikey,
       apiSecret : //apiSecret
    });

    last_fm.user.getTopTracks({
        user   : user
        period : //track period
        limit  : //track count
    }, {
       success: function( data ){
          var track_arr;
          track_arr = data.toptracks.track;
                  callback( track_arr );

         // HOW DO I RETURN THE TRACKARRAY TO USE LATER??
       },
         error: function( code, message ){}
       });
}; 

for (var i = 0; i < user_list.length; i++) {
    getTopTracks(user_list[i], function( data ){
        console.log( data );
    });
} 

如何遍历用户名数组,为每个用户运行getTopTracks函数,然后在完成加载后将结果合并到一个新数组中?

2 个答案:

答案 0 :(得分:0)

它是一个异步调用,所以它不会像那样工作。您需要使用回调函数:

success: function( data ){
      var track_arr;
      track_arr = data.toptracks.track;

      callback(track_arr);
},

function callback(arr) {
    console.log(arr); //there it is, now do stuff!
}

或者,使用匿名函数:

var getTopTracks = function(callback) {

..
..

success: function( data ){
      var track_arr;
      track_arr = data.toptracks.track;

      callback(track_arr);
},

现在调用它并传入一个匿名函数

getTopTracks(function(data) {
    console.log(data); //there it is again! do stuff!
});

答案 1 :(得分:0)

简短的回答是:你没有。

这是一个回调函数,因此您要执行的任何处理都必须在回调中完成,否则回调必须调用另一个回调函数,并将其结果作为参数传递。

success: function( data ){
          var track_arr;
          track_arr = data.toptracks.track;

          doSomethingAwesomeWithResults(track_arr);
       },

然后,在API调用之外定义:

function doSomethingAwesomeWithResults(track_arr) {
    //your custom logic here
}