需求是每日十点请求一次接口。
初始方法是写一个一分钟的轮询,定时查询系统时间,如果时间为10点就执行请求函数。但是考虑这样太浪费资源,在师傅的帮助下找到了一个更优的方法。计算当前时间和目标时间的时间间隔,如果超过,则设置定时查询的时间间隔为距离明天目标小时的距离,如果还没到就设置时间为当前时间到目标小时的距离。
更优代码:
/*
入参是目标时间的小时数,取值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(){
msg()
setTimeout(getProductFileList,24*3600 * 1000)//之后每天调用一次
}
setRegular(10);//比如目标是每天早上8点
原始方法:
//获取当前时间
function showTime(){
var time = new Date(); // 得到当前时间
var h = time.getHours();
var i = time.getMinutes();
return h+":"+i
}
//轮询 十点查询一次
setInterval(function () {
showTime();
if (showTime() == '10:0'){
msg()
}
} ,60000);