【问题标题】:How can I nest setInterval and setTimeout in my function?如何在我的函数中嵌套 setInterval 和 setTimeout?
【发布时间】:2020-06-11 07:44:51
【问题描述】:

早安,

我有一个 javascript 函数,它又调用了几个函数。 我想在调用 javascript 函数半秒后触发函数(在下面的示例中为 check1),然后每 10 秒(10000 毫秒)调用相同的函数 check1。经过一些研究后,我发现 - 虽然我可能错了 - setInterval 和 setTimeout 的组合会达成交易。

很遗憾,结果不如预期。

之后,我使用 clearInterval() 进行了第二次尝试,但我不确定如何嵌套这些不同的函数。

有没有一种优雅而聪明的方法来实现这一点?非常感谢您的帮助

下面是我的javascript代码:

// Global variables
var AutoScript = false;
var IntervalRefresh1 = 500;
var newIntervalDefined1 = false;

// calls the startUp method
startUp();


function startUp()
{
  console.log("I'm the startup2");
  setInterval(check1, IntervalRefresh1);
}


function check1()
{
  $.ajax({
  type: 'POST',
  url: 'php/checker1.php',
  dataType: 'json',
  data: {
  counter:$('#message-list').data('counter')
  }
  }).done(function( response ) {
  /* check if with response we got a new update */
  if(response.update==true)
  {
    var j = response.news;      
    $('#message-list').html(response.news);
    AutoScript = true;
    // here I call a specific method named after getDataFromDatabase(j);
    AutoScript = false;        
    if (newIntervalDefined1 == false)
    {
      setTimeout(check1, 10000);
      newIntervalDefined1 == true;
    }
  }
  });
}

【问题讨论】:

    标签: javascript settimeout setinterval


    【解决方案1】:

    问题是您在间隔内调用check1 但没有清除它。所以这将在每 500 毫秒时被调用一次。

    setInterval(check1, IntervalRefresh1);

    在顶部,您再次使用setTimeout 调用该函数。您也必须在某个时候根据条件清除它,以免它无限运行。查看代码和 cmets。

    var timerinterval;
    var timeout;
    function startUp()
    {
      console.log("I'm the startup2");
      timerinterval = window.setInterval(check1, IntervalRefresh1); //set a timerInterval
    }
    
    
    function check1()
    {
      $.ajax({
      type: 'POST',
      url: 'php/checker1.php',
      dataType: 'json',
      data: {
      counter:$('#message-list').data('counter')
      }
      }).done(function( response ) {
      /* check if with response we got a new update */
      if(response.update==true)
      {
        var j = response.news;      
        $('#message-list').html(response.news);
        AutoScript = true;
        // here I call a specific method named after getDataFromDatabase(j);
        AutoScript = false;        
        if (newIntervalDefined1 == false)
        {
          clearInterval(timerinterval); //clear the interval timer
         timeout =  setTimeout(check1, 10000); //now clear this too at some point of time so that it doesn run infinitely
          newIntervalDefined1 == true;
        }
      }
      });
    

    【讨论】:

    • 非常感谢 ABGR。我不明白的是,如果我希望 check1 无限期地每 10 秒运行一次,为什么还要清除超时?或者也许我错过了一点。
    • 如果你想无限运行它,你不必清除它。但通常你想在某个时候停止它。但是,如果您有意允许,则可以这样做。
    【解决方案2】:

    永远不要将 setInterval 与 async/ajax 一起使用

    只需使用 setTimeout

    或移动

    setTimeout(check1, 10000);

    到你的特殊功能

    // Global variables
    var AutoScript = false;
    
    function check1() {
      $.ajax({
        type: 'POST',
        url: 'php/checker1.php',
        dataType: 'json',
        data: {
          counter: $('#message-list').data('counter')
        }
      }).done(function(response) {
        /* check if with response we got a new update */
        if (response.update == true) {
          var j = response.news;
          $('#message-list').html(response.news);
          AutoScript = true;
          // here I call a specific method named after getDataFromDatabase(j);
          AutoScript = false;
          setTimeout(check1, 10000);
        }
      });
    }
    $(function() {
      check1()
    })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-29
      • 2021-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多