多个固定时间点,检测是否到下个时间点,执行任务[非倒计时执行任务]
发布于 8 年前 作者 NextZeus 4047 次浏览 来自 分享
/**
 * 检测是否能够刷新
 * @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 那样定时执行任务?

https://npm.taobao.org/package/cron

@alsotang 不是定时,是在指定方法里,判断规定的时间点是不是到了, 到了就做某些处理。

比如说,我要在凌晨0点,中午12点,和晚上18点 这三个时间点更新用户的某些信息, 加入现在是11:59分,12点后,用户发起了某个请求,这时候我就在用户的信息保存之前,判断到了12点,然后更新用户的某些数据。

可以做个刷新模块,所有的刷新都通过这个模块去判断

回到顶部