2013-11-25 2 views
2

jquery 지연/약속에 대해 자세히 배우려고합니다. 일종의 아약스 콜을하고 싶을 때 일종의 이해하지만 여러 건 (x 번호) 아약스 콜을 함께하면 어떨까요?jQuery Deferred/많은 getJSON과의 약속

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를 반환합니다 (lastFM API를 사용하여) 예를 들어 http://jsfiddle.net/vRJ7v/

: 여기에 내가 할 노력하고있어의 jsfiddle이다

답변

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); 
}; 

결과를 처리하려면 arguments 배열을 반복합니다. 나는이 때

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

감사합니다,하지만, 그것은 단지 한 사용자를 반복합니다. 여기 내 완전한 코드의 jsfiddle입니다. http://jsfiddle.net/vRJ7v/ – cusejuice

+0

,'results'는 첫 번째 요청의 결과이므로. 두 번째 인수는 두 번째 요청에 사용되며 세 번째 인수는 세 번째 요청에 사용됩니다. 'console.log (arguments)' –

+0

흠, user_list 배열에 입력 한 각 사용자의 모든 트랙을 어떻게 출력 할 수 있습니까? user_list에 10 명의 사용자가있는 경우 10 개의 인수로 하드 코딩해야합니다. 결과를 대신 하나의 큰 배열로 결합 할 수있는 방법이 있습니까? – cusejuice