0

我在调用 2 个单独的 ajax 函数时遇到问题。我有一个循环遍历页面上的所有复选框元素,然后如果它们被选中,它会调用一个 ajax 函数来移动我的数据库中的一些数据。然后在 for 循环之外,我调用另一个 ajax 函数,该函数进入我的数据库并将结果拉回我的 ID 元素。我不得不以不同的方式命名我的 httprequests,这样它们就不会打架,这两个功能都可以工作,但是我循环之外的那个功能很快,并且不会提取新的/更改的数据。如果我在这个外部循环函数之前发出警报,它就会起作用。我也尝试过使用 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;
}
4

2 回答 2

2

您需要跟踪最后一个moveContact()异步 ajax 函数何时完成,然后(并且仅在那时)调用groupList1().

由于您尚未披露moveContact()可能正在执行 ajax 调用的代码,因此我们不能真正推荐跟踪它们的具体细节。一种简单的技术是设置挂起 ajax 调用的计数器,并在 ajax 调用的每个成功处理程序中moveContact(),检查计数器现在是否已达到零。如果是这样,您可以调用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;
}
于 2013-03-13T09:18:10.177 回答
-1

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

var finished = 0;
moveContact(email, group, function() {
   if (++finished == 25) {
       groupList1(group);
   }
});
于 2013-03-13T09:23:21.647 回答