jquery foreach with ajax / keep order

时间:2010-11-02 00:26:31

标签: jquery

我在数组上遇到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

1 个答案:

答案 0 :(得分:1)

如果要强制执行订单,请使用数组。如果你想要那里的命名值,使用数组os数组,例如[['key1', 'val1'], ['key2', 'val2']]。但是,这有点乱,你不能通过键访问元素而不迭代数组。

因此,只需更改代码,使其不依赖于对象中条目的顺序。 您无法确保按特定顺序调用的AJAX请求无论如何都以相同的顺序获得响应 - 它是异步的。虽然您可以使用asynchronos ajax(sjax?:p)请求,但您确实不想这样做。他们挂起了一些旧的浏览器,如果你一个接一个地发送多个浏览器,用户必须等待所有请求完成才能完成。