如何阻止下一行执行,直到SetInterval循环被清除

Javascript: How to prevent the next line executed until SetInterval loop has been clearinterval?

本文关键字:直到 SetInterval 循环 清除 执行 一行 何阻止      更新时间:2023-09-26

最近我正在做一个使用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();

我试图确保functionond只会被执行一次loop1已经结束与clearInterval,它不能被执行时,functionB和functionC仍在循环中,只有当functionond被执行,函数Main将等待16000ms并重新启动。

我尝试了很多方法setInterval和setTimeout,但没有运气。javascript专家知道怎么做吗?

当你想要这个:

  1. 运行功能阳极()
  2. 每4秒并行运行functionB()和functionC()
  3. 当停止运行functionB()和functionC()时,运行functionD一次
  4. 当函数d完成时,以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();

另一种方法是将主函数分成几个部分,并在清除循环后调用第二部分。

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);
          goOn();
      }
    }
  });
}
function goOn(){
  functionD();//can be anything
  setTimeout(Main, 16000);
}
function Main(){
  functionA();//can be anything
  loop1 = setInterval(function () {
     setTimeout(functionB, 1000);
     setTimeout(functionC, 1000);
  }, 3000);
}
main();