• javaScript(js)手写原生任务定时器源码


    javaScript(js)手写原生任务定时器

    功能介绍

    定时器顾名思义就是在某个特定的时间去执行一些任务,现代的应用程序早已不是以前的那些由简单的增删改查拼凑而成的程序了,高复杂性早已是标配,而任务的定时调度与执行也是对程序的基本要求了。通过时间表达式来进行调度和执行的一类任务被称为定时任务,很多业务需求的实现都离不开定时任务。

    在javascript中要实现定时任务也是很简单的,可以选择插件,也可以自己写一个简单的定时任务,这里就个给大家写一个简单的 setInterval() 循环定时任务。功能有,启动定时任务、停止定任务、添加定时任务、清除定时任务、执行定时器的方法。

     

    实现调用演示

    1.定义两个方法 有参和无参

    复制代码
            function a1(value = "") {
                console.log("定时任务被调用了 携带的参数==>>", value)
            }
    
            function a2() {
                console.log("定时任务被调用了 我是无参数")
            }
    复制代码

     

    2. 实现定时任务

    复制代码
            let daily_time = {
                func: a1,
                parm: "我是每秒",
                year: "*",
                month: "*",
                date: "*",
                hours: "*",
                minutes: "*",
                seconds: "*"
            }
            let monthly_transaction = {
                func: a2,
                parm: null,
                year: "*",
                month: "*",
                date: "*",
                hours: "*",
                minutes: "1",
                seconds: "*"
            }
            
            let monthly_summary = {
                func: a1,
                parm: "我是每小时 1分 1秒",
                year: "*",
                month: "*",
                date: "*",
                hours: "*",
                minutes: "1",
                seconds: "1"
            }
            addTimer(daily_time)
            addTimer(monthly_transaction)
            addTimer(monthly_summary)
            startTimer()
    复制代码

     

    创建定时任务js 代码文件 复制使用即可

    bg-timer.js

    复制代码
    // 缓存定时任务
    // {
    //     func 方法名
    //  parm 方法参数
    
    //     year 年
    //     month 月
    //  date 日
    //     hours 时
    //     minutes 分
    //     seconds 秒
    // }
    //  * 表示每刻都执行  数字 表示定时这个时间执行

    /**
    * 每年 1月1日1时1分1秒
    * year *
    * month 1
    * date 1
    * hours 1
    * minutes 1
    * seconds 1
    */

    
    

    /**
    * 每年每月每日每时1分每秒
    * year *
    * month *
    * date *
    * hours *
    * minutes 1
    * seconds *
    */

    
    

    /**
    * 每秒
    * year *
    * month *
    * date *
    * hours *
    * minutes *
    * seconds *
    */

    var timer_list = []
    var is_timer = null
    
    
    // 启动
    function startTimer() {
        console.log("启动定时任务")
        if (!is_timer) {
            timeoutFunc()
        }
    }
    
    // 停止
    function stopTimer() {
        console.log("停止定时任务")
        if (is_timer) {
            clearInterval(is_timer);
            is_timer = null
        }
    }
    
    // 清除定时任务
    function cleanTimer() {
        stopTimer()
        timer_list = []
    }
    
    
    // 添加定时任务
    function addTimer(item = {}) {
        let n = {
            "func": item.func || null,
            "parm": item.parm || null,
            "year": item.year || "*",
            "month": item.month || "*",
            "date": item.date || "*",
            "hours": item.hours || "*",
            "minutes": item.minutes || "*",
            "seconds": item.seconds || "*"
        }
        timer_list.push(n)
    }
    
    
    function timeoutFunc() {
        if (is_timer) {
            return
        }
        is_timer = setInterval(function() {
            let da = new Date()
            let fullYear = (da.getFullYear()).toString()
            let month = (da.getMonth()).toString()
            let dat = (da.getDate()).toString()
            let hours = (da.getHours()).toString()
            let minutes = (da.getMinutes()).toString()
            let seconds = (da.getSeconds()).toString()
    
            // console.log("定时......",timer_list)
            // console.log("年:", fullYear)
            // console.log("月:", month)
            // console.log("日:", dat)
            // console.log("时:", hours)
            // console.log("分:", minutes)
            // console.log("秒:", seconds)
    
            for (let i in timer_list) {
                let item = timer_list[i]
    
                if (item.year != "*" && item.year != fullYear) {
                    continue
                }
                if (item.month != "*" && item.month != month) {
                    continue
                }
                if (item.date != "*" && item.date != dat) {
                    continue
                }
                if (item.hours != "*" && item.hours != hours) {
                    continue
                }
                if (item.minutes != "*" && item.minutes != minutes) {
                    continue
                }
                if (item.seconds != "*" && item.seconds != seconds) {
                    continue
                }
                console.log("调用定时任务", item)
                if (item.func && item.parm) {
                    item.func(item.parm)
                } else {
                    item.func()
                }
            }
        }, 1000)
    }
    复制代码

     结束:

      感谢个朋友们的支持,如有喜欢请点赞评论

    现在最简单的定时任务已经完成了,各位朋友可以从此基础去往更深层次的定时任务进行下一步的研发和修改。也希望各位朋友把研发结果分析在评论区。

     

    点个赞呗!

  • 相关阅读:
    Mybatis二级缓存详解
    Java注解和工程搭建
    自动驾驶中,实现三维点旋转原理
    《大气压流注放电的二维PIC/MCC模拟研究》听讲笔记
    抖音文案怎么写合适|成都聚华祥
    Linux邻居协议 学习笔记 之四 通用邻居项创建、查找、删除等相关的函数
    Java后端学习路线
    vue3 nextTick
    Unity中Shader实现UI流光效果
    高考志愿系统-信息管理模块:院校信息分析
  • 原文地址:https://www.cnblogs.com/YushinFukuhara/p/15963980.html