多个固定时间点,检测是否到下个时间点,执行任务[非倒计时执行任务]
/**
* 检测是否能够刷新
* @param timeArray 刷新时间小时数组
* @param lastTime 上次的执行时间戳
* @returns {boolean}
*/
function checkRefreshAble(timeArray, lastTime){
var date = new Date(lastTime);
var hour = date.getHours();
var nextHour ;
for(var i = 0 ; i < timeArray.length; i++){
if(timeArray[i] > hour){
nextHour = timeArray[i];
break;
}
}
console.log('timeArray--->>',timeArray);
var currHour = new Date().getHours();
console.log('currHour:',currHour,' lastHour : ', hour, ' nextHour:',nextHour);
if(!nextHour){
nextHour = timeArray[0];
return currHour >= nextHour && currHour < timeArray[timeArray.length - 1];
}
return(currHour >= nextHour);
}
测试
var obj = {
time : 0
}
var timeArray = [0,4,12]; //每天凌晨 4点 12点执行任务
setInterval(function () {
//检测是否能够执行
var res = checkRefreshAble(timeArray, obj.time);
if(res){
console.log('refresh---->>>');
//todo 执行任务
obj.time = Date.now();
}
},2000);
9 回复
我是自己改服务器时间,测试的。 已经应用在商店物品刷新逻辑里了。
刚开始想的时候,还想着加一个字段,存储任务的执行状态。 想了又想,最后还是觉得加一个状态,就会需要管理这个状态,就又思考了下,最终把这个状态给去掉了。 只依赖上次任务执行的时间戳,去判断是否可执行下个时间点的任务。
Later 库 也行吧 自豪地采用 CNodeJS ionic
@immatt2015 我这个是用于主动触发的任务, 用不到倒计时。
应用场景
userSchema.pre('save', function (next) {
var checkRes = checkRefreshAble(timeArray, lastTime);
if(checkRes){
//todo 刷新用户身上的部分数据
}
next();
})
在用户信息保存前,做了某些处理,主动刷新用户的部分数据, 不考虑用倒计时那样的方式去 定时跑任务。
类似 crontab 那样定时执行任务?
@alsotang later更好用
@alsotang 不是定时,是在指定方法里,判断规定的时间点是不是到了, 到了就做某些处理。
比如说,我要在凌晨0点,中午12点,和晚上18点 这三个时间点更新用户的某些信息, 加入现在是11:59分,12点后,用户发起了某个请求,这时候我就在用户的信息保存之前,判断到了12点,然后更新用户的某些数据。
可以做个刷新模块,所有的刷新都通过这个模块去判断