【问题标题】:Update Javascript Timer Interval periodically [duplicate]定期更新Javascript计时器间隔[重复]
【发布时间】:2020-11-26 18:28:51
【问题描述】:

我正在创建一个 javascript 函数来显示正在运行的任务的状态 [它将每 1 小时运行一次,完成需要一些时间] 此功能将让最终用户知道任务当前是否正在运行

为了在加载事件上执行此操作,我创建了一个函数并为此设置了 10 分钟的间隔,因此每 10 分钟它会告诉用户任务的状态

如果发现任务在服务器上运行,我想将间隔减少到 1 分钟。所以一旦任务完成,用户就会得到一个想法,他们可以使用门户网站重新启动。 一旦检测到它没有运行,就想再次将间隔恢复到原来的 10 分钟。

目前的实现如下

       $(function () {           
            loadSyncStatus();
            setInterval(function () {
                // Invoke function every 10 minutes (600000)
                loadSyncStatus();
            }, 600000);
        
        });
    
    function loadSyncStatus() {
        var action_url = '@Url.Content("~/Controller/GetSyncStatus")';             
        $.ajax({
            url: action_url,
            type: 'GET',
            contentType: "application/json; charset=utf-8",
            dataType: 'json',
            success: function (response) {                    
                   $("#dataSyncStatus").html(response.message);
                   
                    if(response.running_flag=true){
                      //check the status every 1 minute *****TODO****
                    }
                    else{
                     //reset the interval back to 10 minutes  *****TODO****
                    }                       
                }
        }) 
    }

【问题讨论】:

  • 一个运行区间的延迟是不能改变的,你必须清除原来的区间,然后用一个新的延迟值开始一个新的区间。
  • 第一个问题是你扔掉了setInterval()返回的东西。那将是您可以用来关闭计时器的 ID。以目前的形式,它会永远运行,很难想象你对此有多满意。

标签: javascript setinterval


【解决方案1】:

请试试这个 它将在600000 之后调用loadSyncStatus()

var myTimeOut=0;
    $(function () {     
            loadSyncStatus();
         myTimeOut = setTimeout(loadSyncStatus, 600000);
        });

function loadSyncStatus() {
    clearTimeout(myTimeOut);
    myTimeOut = setTimeout(loadSyncStatus, 600000);
    var action_url = '@Url.Content("~/Controller/GetSyncStatus")';             
    $.ajax({
        url: action_url,
        type: 'GET',
        contentType: "application/json; charset=utf-8",
        dataType: 'json',
        success: function (response) {                    
               $("#dataSyncStatus").html(response.message);
               
                if(response.running_flag=true){
                  //check the status every 1 minute *****TODO****
                }
                else{
                 //reset the interval back to 10 minutes  *****TODO****
                }                       
            }
    }) 
}

【讨论】:

    【解决方案2】:

    你可以根据id使用clearInterval

    let id = setInterval(function () {
     // Invoke function every 10 minutes (600000)
      loadSyncStatus();
    }, 600000);
    
    

    if(response.running_flag=true){
      clearInterval(id);
      id = setInterval(loadSyncStatus, 60000);
    }
    else{
      clearInterval(id);
      id = setInterval(loadSyncStatus, 600000);
    }   
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-04
      • 1970-01-01
      相关资源
      最近更新 更多