【问题标题】:jQuery Deferred/Promises with many getJSON带有许多 getJSON 的 jQuery Deferred/Promises
【发布时间】:2013-11-25 18:48:14
【问题描述】:

我正在尝试了解有关 jquery deferred/promises 的更多信息。我有点理解当你想要进行 1 个 ajax 调用时,但是一起做多个(x 个)ajax 调用呢?这是我正在尝试做的一个 jsfiddle: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

【问题讨论】:

    标签: javascript jquery jquery-deferred deferred last.fm


    【解决方案1】:

    $.when 每个参数接受一个承诺,而不是一组承诺。如果你想使用一个数组,你必须使用.apply,这样你才能正确地将promise数组应用到.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/

    【讨论】:

    • 谢谢,但是当我尝试这个时,它只循环通过 1 个用户。这是我完整代码的 jsfiddle。 jsfiddle.net/vRJ7v
    • 正确,因为results 是第一个请求的结果。第二个参数将用于第二个请求,第三个将用于第三个,依此类推。 console.log(arguments)
    • 嗯,如何输出我在 user_list 数组中输入的每个用户的所有曲目?如果我在 user_list 中有 10 个用户,那么我需要硬编码 10 个参数吗?有没有办法可以将结果组合成一个大数组?
    • 是的,arguments 是您要查找的数组。 console.log(arguments) 但是请注意 arguments 不是真正的数组,因此它可能缺少一些您在使用数组时熟悉的方法。
    • 似乎无法弄清楚。有什么指导吗?
    猜你喜欢
    • 2013-09-28
    • 1970-01-01
    • 1970-01-01
    • 2014-04-12
    • 2016-05-10
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 2012-12-19
    相关资源
    最近更新 更多