Javascript: 如何防止下一行执行到SetInterval循环已经clearinterval?

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

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

我正在尝试确保 functionD 仅在 loop1 以 clearInterval 结束后才执行,当 functionB 和 functionC 仍在循环中时无法执行,只有在执行 functionD 时,函数 Main 才会等待 16000 毫秒,然后重新启动。

我用 setInterval 和 setTimeout 尝试了很多方法,但没有成功。 任何 javascript 专家都知道如何做到这一点?

当你想要这个:

  1. 运行宁函数A()
  2. 运行每 4 秒并行执行一次 functionB() 和 functionC()
  3. 当停止时 运行调用 functionB() 和 functionC() 然后 运行 functionD 一次
  4. 当 functionD 完成时 运行 Main() 延迟 16 秒

为循环添加一个存活检查

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();