我正在尝试了解有关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
答案 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
});