jQuery Deferred / Promises有很多getJSON

时间:2013-11-25 18:48:14

标签: javascript jquery jquery-deferred deferred last.fm

我正在尝试了解有关jquery延迟/承诺的更多信息。我想知道什么时候你想做1个ajax调用,但是如何一起做多个(x号)ajax调用呢?这是我正在尝试做的事情:http://jsfiddle.net/vRJ7v/

例如(使用lastFM api):

var last_fm_url = 'http://ws.audioscrobbler.com/2.0/?method=user.gettoptracks&user='; 
var apiKey = //my lastfm api key;
var user_list = ['user1','user2'.....'userX'];

var getTracks = function( user ){
    var dfd, last_fm_url;

    dfd = $.Deferred();

    last_fm_url = last_fm_url + user + '&limit=10&period=3month&api_key='+ apiKey +'&format=json';

    $.getJSON( last_fm_url ).done(function( results ) {
        dfd.resolve();
    }).fail(function( error ) {
        dfd.reject();
    });

    return dfd.promise();

};

var fetchMultipleTracks = function(){
     var dfd, user_list_count, promises = [];

     var dfd = $.Deferred();

     user_list_count = user_list.length;

     for(var i = 0; i < user_list_count; i++ ){
         promises.push( getTracks(user_list[ i ]) );
     }

     $.when( promises ).done(function(results){
         dfd.resolve();
     });

     return dfd.promise();
};

var test = fetchMultipleTracks();
test.done(function( results ){
  console.log( results );  
}, function( error ){
    // error
});

但我似乎无法返回实际结果,只返回http://d.pr/i/N5Yi

1 个答案:

答案 0 :(得分:4)

$.when每个参数接受一个承诺,而不是一系列承诺。如果您希望使用数组,则必须使用.apply,以便正确地将承诺数组应用于.when方法。

$.when.apply($,myArrayOfPromises).done(...

此外,$.when会返回一个承诺,因此您无需生成另一个承诺。

var fetchMultipleTracks = function(){
     var user_list_count, promises = [];

     user_list_count = user_list.length;

     for(var i = 0; i < user_list_count; i++ ){
         promises.push( getTracks(user_list[ i ]) );
     }

     return $.when.apply($, promises );
};

要处理结果,请遍历参数数组。

get_tracks.done(function(){
   $.each(arguments,function(i,result) {
      console.log(result)
      outputTracksToDom(result.toptracks.track);
   });
}).fail(function(error ){
    // handle error
});

http://jsfiddle.net/vRJ7v/1/