如何在循环中仅在成功时运行ajax请求?

时间:2015-06-12 19:22:39

标签: jquery ajax

这是我的方案,首先我从ajax获取匹配结果,然后将每个玩家ID传递给下一个函数以获取他们的名字。这是我的代码,我期待的是ID 1 - > ID 1播放器名称,但由于ajax是异步的,我从结果得到的都是错误的顺序。但是,如果我将第二个函数设置为async:false,那么获取所有结果需要很长时间。

var getCurrentMatch = function(playerID) {
  $.ajax({
    type: "GET",
    url:"url1",
    dataType:'json', 
    success: function(data){
        $.each( data.participants, function( index, player ) {
            getChampionInfo(player.championId);
        });
    }
  });
};
var getChampionInfo = function(championID) {
  $.ajax({
    type: "GET",
    url:"url2",
    dataType:'json', 
    success: function(data){
        console.log(data[championID]);
    }
  });
};

2 个答案:

答案 0 :(得分:0)

我不认为这里的问题在哪里。

在你的第一个成功函数(对于url1 AJAX调用)中,你必须选择:

  • Parallels呼叫:您为每个玩家循环并拨打电话。在这种情况下,所有呼叫都将在同一时间内,并且回复将不会到达,但只是在完成时随机结束。

  • 系列调用:在这种情况下,您循环播放每个播放器并仅为第一个播放器拨打电话。当您收到回复时,您将接受2de玩家并提出请求......

第二种情况是很长时间才能完成所有事情,因为你链接他们。如果单个呼叫在5秒内完成,则所有呼叫将在5-10秒内并行完成,但如果您有10个(或100个)玩家,则必须等待50秒(或500秒=>超过8分钟!)

为了更轻松地完成这项工作,我建议您使用async库。您将能够同时执行方法eachSeries(在系列中)或each(并行)方法(您还可以与eachLimit混合使用(例如:为前5位玩家制作并行方式,并等待结果让其他人打电话,但绝不会超过5)

答案 1 :(得分:0)

好的,所以看起来url2包含循环请求的所有数据。不要循环它们,请求参与者列表,然后请求冠军。然后循环以获取所需的数据。

var tmpParticipants;
var tmpChampions;

var getCurrentMatch = function(playerID) {
  $.ajax({
    type: "GET",
    url:"url1",
    dataType:'json', 
    success: function(data){
        tmpParticipants = data;
        getChampionInfo();
    }
  });
};
var getChampionInfo = function() {
  $.ajax({
    type: "GET",
    url:"url2",
    dataType:'json', 
    success: function(data){
        tmpChampions = data;
        $.each( tmpParticipants, function( index, player ) {
            tmpParticipants[index]["championId"] = tmpChampions[index].championId;
            // of course, this is dependent on how your data is structured 
            // so you may have to massage it differently
        });
    }
  });
};

这可以用Deferreds and Promises清理一下,但这是另一个问题。