2013-11-25 119 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