js定时每天某个时间,执行异步方法

柠檬冻薄荷
  • 126

1.页面客户长期打开,需要在每天某个时间进行定时刷新数据(执行异步方法)。
2.

function getProductFileList() {
    $.ajax({
        url: MMBS_IP + '/resources/rest/climate/alarm/getProductFileList',
        type: 'get',
        async: true,
        beforeSend: ajaxLoading,
        success: function(data) {
            if(data.length > 0) {
                var strHtml = "";
                for(var i = 0; i < data.length; i++) {
                    var detail = JSON.stringify(data[i]);
                    strHtml += "<div id='" + i + "' onclick='fileView(" + detail + ")'>";
                    strHtml += data[i].name;
                    strHtml += "</div>";
                }
                $("#product-scroll").html(strHtml);
            } else {
                $.messager.alert('温馨提示', '此条件下无数据!', 'info');
            }
        },
        /*error: function(xhr, textStatus) {
            $.messager.alert('温馨提示', '访问出错!', 'info');
        },*/
        complete: ajaxLoadEnd
    });
    meter1=setTimeout("getProductFileList()", 20000);
    console.log("getProductFileList()"+meter1)
}

通过此方法可以没20秒刷新一次,但是无法做到每天某个时间定时刷新。

回复
阅读 9.2k
6 个回答
✓ 已被采纳

谢邀,延伸下2楼的思路,直接定位即可。初次进入的时候,计算当前时间和目标时间的距离,执行一次setTimeout(func,距离时间),第二次开始,把setTimeOut的时候设置成24小时。代码

/* 
  入参是目标时间的小时数,取值0-23,当然可以根据需要拓展成分钟数,这里主要是提供思路所以从简
 */
function setRegular(targetHour){
  var timeInterval,nowTime,nowSeconds,targetSeconds 

  nowTime = new Date()
  // 计算当前时间的秒数
  nowSeconds = nowTime.getHours() * 3600 + nowTime.getMinutes() * 60 + nowTime.getSeconds()

  // 计算目标时间对应的秒数
  targetSeconds =  targetHour * 3600

  //  判断是否已超过今日目标小时,若超过,时间间隔设置为距离明天目标小时的距离
  timeInterval = targetSeconds > nowSeconds ? targetSeconds - nowSeconds: targetSeconds + 24 * 3600 - nowSeconds 

  setTimeout(getProductFileList,timeInterval * 1000)
}

function getProductFileList(){
  $.ajax()//你自己的数据处理函数
  setTimeout(getProductFileList,24*3600 * 1000)//之后每天调用一次
}
setRegular(8);//比如目标是每天早上8点

提供一种思路吧,不使用第三方的库,主要还是使用setTimeout:

假设需求是每天8点刷新。

定义一个A方法,目的是获取当前时间,制定一些策略:

当A获取到的时间小于7点时,一小时后再执行A;当大于7点小于8点时,每1分钟执行一次A,直到当前获取到时间为8点,执行getProductFileList函数;当时间大于8点时,恢复每一小时执行一次A的频率。

当然,这个策略还可以进行优化的,目的是为了尽可能减少setTimeout的次数但是又可以尽可能的在8点整执行getProductFileList。

A方法在客户打开页面时执行一次。

其实这个不是太麻烦,你既然有了定时器,只是在循环定时器中添加一个检查条件,到了某个规定的时刻就执行而已。
需要注意的是,到底这个时刻是以服务器时间为准还是客户时间为准,如果以服务器时间,则服务器需要用一定的机制把时间信息发布给客户端,如果以客户端的为准,则可以利用date、time相关api。

这个定时是不是用服务器端的crontab来做一次定时访问某个页面,然后在页面的缓存中保存数据会容易些?

为啥要自动刷页面。。这种需求明显是要websocket 啊。你这样刷,没几天,哦不。没几个小时浏览器就卡死崩溃了

宣传栏