2013-11-25 58 views
2

我想了解更多关于jQuery推迟/承诺。我有点理解你什么时候想做1个Ajax调用,但是怎么做多个(x个)Ajax调用呢?这里是我想要做的jsfiddle:http://jsfiddle.net/vRJ7v/jQuery推迟/承诺与许多getJSON

例如(使用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

回答

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/

+0

谢谢,但是当我尝试这一点,只能通过1个用户环路。这是我的完整代码的jsfiddle。 http://jsfiddle.net/vRJ7v/ – cusejuice

+0

没错,因为'结果'是第一个请求的结果。第二个参数将用于第二个请求,第三个将用于第三个,依此类推。 'console.log(arguments)' –

+0

嗯,我如何输出user_list数组中输入的每个用户的所有曲目?如果我在user_list中有10个用户,那么我需要在10个参数中进行硬编码?有没有一种方法可以将结果合并到一个大数组中? – cusejuice