我在数组上遇到jquery $ .ajax和forEach的问题......
这是代码
function getFfttData() {
// reinit object
pdatas={};
checked_matchs=0;
var licence_arr=[];
$('#calculator_form input[name="licence"]').each(function() {
var value = $(this).val().trim();
if (value != '' ) {
licence_arr.push(value);
}
});
if (licence_arr.length === 0 ) {
show_error("Aucune licence à vérifier....");
return;
}
var coef = parseFloat($('#type_compet').attr("value"));
if (coef === 0) {
show_error("Choisissez le type de compétition pour vos matchs");
return;
}
pdatas.coef=coef;
pdatas.compet_id = $('#type_compet :selected').attr("name");
pdatas.compet_name = $('#type_compet :selected').text();
pdatas.pts_officiels = parseInt($("#points_fftt").html().trim(), 10);
pdatas.pts_mensuels = parseInt($("#pts_off_mensuels").html().trim(), 10);
pdatas.licence_arr=licence_arr;
pdatas.adv_name=[];
pdatas.adv_club=[];
pdatas.adv_cat=[];
pdatas.pts_adv_encours=[];
pdatas.pts_adv_mensuels=[];
pdatas.matchs_rejetes=[];
pdatas.matchs_count=licence_arr.length;
$("#loader").show();
pdatas.licence_arr.forEach(function(licence) {
dcheck=false;
return getPlayerDatas(licence);
});
$("#loader").hide();
}
function getPlayerDatas(licence) {
if (dcheck === false) { // check categorie Masculin
var req='http://fftt.com/sportif/pclassement/php3/FFTTfi.php3?session=precision='+licence+'&reqid=200';
} else { //feminine
var req='http://fftt.com/sportif/pclassement/php3/FFTTfi.php3?session=precision='+licence+'&reqid=300';
}
$.ajax({
type: "GET",
url: req,
timeout : 5000,
success: function(data) {
data.licence=licence;
var ret_licence = $(data.responseText).find('td').eq(3).text().trim().replace(/\s+/g," ");
var pts_mensuels = $(data.responseText).find('td').eq(21).text().trim().replace(/\s+/g," ");
if (ret_licence != licence) {
if (dcheck === false) {
dcheck = true;
return getPlayerDatas(licence);
}
}
dcheck=false;
return store_player_datas(data);
}
});
}
function store_player_datas(data) {
var error = $(data.responseText).find('strong').eq(0).text().trim();
var pname = $(data.responseText).find('td').eq(0).text().trim();
if (error === "Aucune information trouvée" || pname === "") {
pdatas.adv_name.push(data.licence+" introuvable");
pdatas.adv_club.push("?");
pdatas.adv_cat.push("?");
pdatas.pts_adv_encours.push(0);
pdatas.pts_adv_mensuels.push(0);
pdatas.matchs_rejetes.push(1);
} else {
pdatas.adv_name.push(pname.replace(/\'/g,' '));
pdatas.adv_club.push($(data.responseText).find('td').eq(6).text().trim().replace(/\s+/g," ").replace(/\'/g,' '));
pdatas.adv_cat.push($(data.responseText).find('td').eq(10).text().trim());
pdatas.pts_adv_encours.push($(data.responseText).find('td').eq(16).text().trim());
pdatas.pts_adv_mensuels.push($(data.responseText).find('td').eq(21).text().trim());
pdatas.matchs_rejetes.push(0);
}
checked_matchs++;
if (checked_matchs == pdatas.matchs_count) {
$("#loader").hide();
return calc_points();
}
}
//calculate results
function calc_points() {
ptsGagnes = 0;
ptsPerdus = 0;
var ecart=0;
var pts_estimes=$("#pts_actuels").text().trim();
var newTotPts = parseFloat(pts_estimes);
var totMatch = pdatas.matchs_count;
pdatas.pts_gagnes = [];
pdatas.ecart=[];
pdatas.match_result=[];
pdatas.matchs_gagnes=0;
pdatas.matchs_perdus=0;
pdatas.rejetes=0;
var res = 0;
for (var i = 0; i < totMatch; i++) {
var licence = pdatas.licence_arr[i];
// verifie le resultat du match
if (pdatas.matchs_rejetes[i] == 1) {
pdatas.ecart.push(0);
pdatas.match_result.push("R");
pdatas.pts_gagnes.push(0);
pdatas.rejetes++;
} else {
// calcul ecart de points
var ecart = (parseFloat(pdatas.pts_adv_mensuels[i]) - parseFloat(pdatas.pts_mensuels));
pdatas.ecart.push(ecart);
var victory = $('input[name="resultat'+i+'"]').attr("checked");
if (victory === true) {
pdatas.matchs_gagnes++;
pdatas.match_result.push("V");
res = ajouterVictoire(pdatas.pts_adv_mensuels[i], pdatas.pts_mensuels, pdatas.coef);
pdatas.pts_gagnes.push(res);
} else {
pdatas.matchs_perdus++;
pdatas.match_result.push("D");
res = ajouterDefaite(pdatas.pts_adv_mensuels[i], pdatas.pts_mensuels, pdatas.coef);
if (res > 0) {
pdatas.pts_gagnes.push('-'+res);
} else {
pdatas.pts_gagnes.push(res);
}
}
}
}
// calcule general de la difference de points
newTotPts += ptsGagnes - ptsPerdus; // ajoute les points gagnes au total des matchs
var differencePts = (parseFloat(newTotPts) - parseFloat(pts_estimes));
pdatas.new_tot_pts = newTotPts;
$("#compet_title").empty().append('<b>Compétition :</b> ' + pdatas.compet_name);
$("#compet_coef").empty().append('<b>Coefficient :</b> ' + pdatas.coef);
$("#calcres_matchs_joues").empty().append(totMatch);
$("#calcres_matchs_gagnes").empty().append(pdatas.matchs_gagnes);
$("#calcres_matchs_perdus").empty().append(pdatas.matchs_perdus);
$("#calcres_matchs_rejetes").empty().append(pdatas.rejetes);
$("#calcres_pts_gagnes").empty().append(ptsGagnes);
$("#calcres_pts_perdus").empty().append(ptsPerdus);
if (differencePts > 0) {
$("#pts_resultat").empty().append("+" + differencePts);
} else {
$("#pts_resultat").empty().append(differencePts);
}
$("#new_rank").empty().append(newTotPts + " points");
//print results
$("#calculator_results").show();
$("#loader").hide();
$('#calcres_matchs_joues').scrollTo(1000);
}
我的pdatas对象(在calc_points函数中)生成的信息数组的顺序错误,我的播放器2的名称附加到原始pdatas.licence_arr中的播放器1的许可证号。 ...
如何保持原始pdatas.licence_arr的订单?
并且可能会告诉我其他错误/改进:)
THX
答案 0 :(得分:1)
如果要强制执行订单,请使用数组。如果你想要那里的命名值,使用数组os数组,例如[['key1', 'val1'], ['key2', 'val2']]
。但是,这有点乱,你不能通过键访问元素而不迭代数组。
因此,只需更改代码,使其不依赖于对象中条目的顺序。 您无法确保按特定顺序调用的AJAX请求无论如何都以相同的顺序获得响应 - 它是异步的。虽然您可以使用asynchronos ajax(sjax?:p)请求,但您确实不想这样做。他们挂起了一些旧的浏览器,如果你一个接一个地发送多个浏览器,用户必须等待所有请求完成才能完成。