这是我的方案,首先我从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]);
}
});
};
答案 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清理一下,但这是另一个问题。