jQuery Deferred/Promises with many getJSON

jQuery Deferred/Promises with many getJSON

本文关键字:many getJSON with Promises Deferred jQuery      更新时间:2023-09-26

我正在尝试了解更多关于jquery递延/承诺的信息。我有点理解你什么时候想做一个ajax调用,但把多个(x个)ajax调用放在一起怎么样?以下是我想要做的事情:http://jsfiddle.net/vRJ7v/

例如(使用lastFMapi):

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

$.when每个参数接受一个promise,而不是一个promises数组。如果要使用数组,则必须使用.apply,以便将promise数组正确应用于.when方法。

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

此外,$.when返回一个promise,因此您不需要生成另一个。

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/