Javascript,ajax计时问题

时间:2013-03-13 09:13:20

标签: javascript ajax

我遇到调用2个独立的ajax函数的问题。我有一个循环遍历页面上的所有复选框元素然后如果它们被检查它调用一个ajax函数,它移动我的数据库中的一些数据。然后在for循环之外我调用另一个ajax函数进入我的数据库并将结果拉回到我的ID元素。我不得不以不同的方式命名我的httprequest,所以他们不打架,两种功能都可以工作,但是我的循环之外的一个功能很快,并没有拉出新的/改变的数据。如果我在这个外部循环函数之前发出警报它然后工作。我也尝试过使用setTimeout(myFunctio(),3000)而没有运气。

这是我的代码。

    function ungroupContact(){
    group = document.getElementsByName("moveGroup")[0].value;
    for(i=0;i<=25;i++){
        if(document.getElementById('checkBox'+i)){
            if(document.getElementById('checkBox'+i).checked){
                var email = document.getElementById('checkBox'+i).value;
                moveContact(email, group);
            }
        }
    }
    //alert("hello");
    //setTimeout(alert("hello"),12000);
    groupList1(group);
}

这是我第一次发帖,对不起,如果这是noobish,目前正在攻读我的计算机科学学位。

感谢您提出任何建议和/或帮助

抱歉,我应该知道提出ajax功能。我使用过w3schools的布局。

   function moveContact(email, group){
    if (email=="" || group=="") 
      {
      document.getElementById("sidebar2").innerHTML="Something wrong was entered";
      return;
      } 
    if (window.XMLHttpRequest)
      {// code for IE7+, Firefox, Chrome, Opera, Safari
      xmlhttp1=new XMLHttpRequest();
      }
    else
      {// code for IE6, IE5
      xmlhttp1=new ActiveXObject("Microsoft.XMLHTTP");
      }
    xmlhttp1.onreadystatechange=function()
      {
    if (xmlhttp1.readyState==1 || xmlhttp1.readyState==2 || xmlhttp1.readyState==3)
        {
        document.getElementById("sidebar2").innerHTML="<img src='images/loading.gif' alt='Loading'> ";
        }

      if (xmlhttp1.readyState==4 && xmlhttp1.status==200)
        {
        document.getElementById("sidebar2").innerHTML=xmlhttp1.responseText;
        }
      }
    xmlhttp1.open("GET","core/moveContact.php?group="+group+"&email="+email,true);
    xmlhttp1.send();
    return;
}

2 个答案:

答案 0 :(得分:2)

您需要跟踪最后moveContact()异步ajax函数的完成时间,然后(仅适用),请调用groupList1()

由于您尚未公开可能正在执行ajax调用的moveContact()代码,因此我们无法真正推荐跟踪它们的具体信息。一种简单的技术是设置待处理的ajax调用的计数器,并在moveContact() ajax调用的每个成功处理程序中,检查计数器现在是否已达到零。如果是,您可以拨打groupList1(group)

假设您向moveContact()添加了完成回调,您可以这样做:

function ungroupContact(){
    group = document.getElementsByName("moveGroup")[0].value;
    var contactsRemaining = 0;
    for(i=0;i<=25;i++){
        if(document.getElementById('checkBox'+i)){
            if(document.getElementById('checkBox'+i).checked){
                ++contactsRemaining;
                var email = document.getElementById('checkBox'+i).value;
                moveContact(email, group, function() {
                    --contactsRemaining;
                    if (contactsRemaining === 0) {
                        groupList1(group);
                    }
                });
            }
        }
    }
}


function moveContact(email, group, fn){
    if (email=="" || group=="") {
      document.getElementById("sidebar2").innerHTML="Something wrong was entered";
      return;
    } 
    if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari
      xmlhttp1=new XMLHttpRequest();
    } else  {// code for IE6, IE5
        xmlhttp1=new ActiveXObject("Microsoft.XMLHTTP");
    }
    xmlhttp1.onreadystatechange=function() {
        if (xmlhttp1.readyState==1 || xmlhttp1.readyState==2 || xmlhttp1.readyState==3) {
            document.getElementById("sidebar2").innerHTML="<img src='images/loading.gif' alt='Loading'> ";
        }

        if (xmlhttp1.readyState==4 && xmlhttp1.status==200) {
            document.getElementById("sidebar2").innerHTML=xmlhttp1.responseText;
            // we are done now, so call the finish callback
            if (fn) {
               fn();
            }
        }
      }
    xmlhttp1.open("GET","core/moveContact.php?group="+group+"&email="+email,true);
    xmlhttp1.send();
    return;
}

答案 1 :(得分:-1)

您可以在成功时添加回调函数,并在所有方法执行完毕后在该函数中执行groupList1函数:

var finished = 0;
moveContact(email, group, function() {
   if (++finished == 25) {
       groupList1(group);
   }
});