最近,我正在一个使用SetInterval和SetTimeout的项目中

这是简单的代码:
(注意:functionB,functionC与jquery ajax请求有关)

    function functionB() {
      jQuery.ajax({
        type: 'POST',
        url: 'https://MYHOSTNAME',
        headers: {
          'Content-Type': 'XXX',
          'Accept': 'XXX'
        },
        data: MYDATA,
        dataType: 'html',
        success: function (data, status, xhr) {
          var RESPONSEDATA = data;
          //true if match my special string
          var Compare = RESPONSEDATA.indexOf(MYSTRING) > -1;
          if (Compare === true){
              //stop the loop
              clearInterval(loop1);
          }
        }
      });
    }


    function Main(){

      functionA();//can be anything

      var loop1 = setInterval(function () {
         setTimeout(functionB, 1000);
         setTimeout(functionC, 1000);
      }, 3000);

      functionD();//can be anything

      setTimeout(Main, 16000);
    }
   main();


我试图确保只有在用clearInterval结束loop1后才执行functionD,当functionB和functionC仍在循环中时不能执行,并且仅当执行functionD时,函数Main将等待16000ms并再次重新启动。

我用setInterval和setTimeout尝试了很多方法,但是没有运气。
任何JavaScript专家都知道该怎么做?

最佳答案

当您想要这个时:


运行functionA()
每4秒并行运行一次functionB()和functionC()
当停止运行functionB()和functionC()然后运行一次functionD
当functionD完成时,以16秒的延迟运行Main()


为循环添加活动检查

var loop1;

function functionB() {
  jQuery.ajax({
    type: 'POST',
    url: 'https://MYHOSTNAME',
    headers: {
      'Content-Type': 'XXX',
      'Accept': 'XXX'
    },
    data: MYDATA,
    dataType: 'html',
    success: function (data, status, xhr) {
      var RESPONSEDATA = data;
      //true if match my special string
      var Compare = RESPONSEDATA.indexOf(MYSTRING) > -1;
      if (Compare === true){
          //stop the loop
          clearInterval(loop1);
          loop1 = false;
      }
    }
  });
}

function aliveCheckOfLoop(){
  if(loop1){
    addTimeout(aliveCheckOfLoop, 500);
  }else{
    functionD();//can be anything
    setTimeout(Main, 16000);
  }
}

function Main(){

  functionA();//can be anything

  loop1 = setInterval(function () {
     setTimeout(functionB, 1000);
     setTimeout(functionC, 1000);
  }, 3000);

  aliveCheckOfLoop();
}

main();

09-27 05:37