TypeScript 任务调度器:cron 库与定时器完全指南

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

TypeScript 任务调度器:完全指南



任务调度器 (task scheduler) 是一种工具,允许您在特定时间或按指定周期执行函数或脚本。在 TypeScript 生态系统中,有多个成熟的库可用于实现此类场景:从简单的定时器到强大的 cron 系统。在本文中,我们将分析主要方法,并展示如何在实际项目中使用它们。



为什么需要任务调度器?

自动化重复性操作是任何服务器应用程序的关键任务。典型场景包括:

  • 每小时发送一次电子邮件通知。
  • 每晚清理临时文件。
  • 在一天结束时收集分析数据。
  • 按计划更新缓存。

TypeScript(和 JavaScript)内置了基本机制——setInterval 和 setTimeout,但对于复杂的调度,使用专门的库更为方便。



内置工具:setInterval 和 setTimeout

最简单的方法是使用全局函数:

// 示例:每 5 秒执行一次const intervalId = setInterval(() => {  console.log('任务执行于', new Date().toISOString());}, 5000);

// 30 秒后停止setTimeout(() => { clearInterval(intervalId); console.log('调度器已停止');}, 30000);

优点:无需安装,可在任何环境中运行。缺点:不支持 cron 表达式,难以管理错过的任务。



node-cron 库

Node.js 最流行的库之一。它使用经典的 cron 格式(5 个字段):分钟、小时、月份中的日期、月份、星期中的日期。



安装

npm install node-cronnpm install @types/node-cron


使用示例

import * as cron from 'node-cron';

// 任务:每分钟执行cron.schedule('* * * * *', () => { console.log('每分钟执行');});

// 任务:每天早上 9:30 执行cron.schedule('30 9 * * *', () => { console.log('每天 9:30 的日常任务');});

// 任务:工作日 18:00 执行cron.schedule('0 18 * * 1-5', () => { console.log('工作日 18:00 执行');});


任务管理

import * as cron from 'node-cron';

const task = cron.schedule('*/5 * * * *', () => { console.log('每 5 分钟执行');});

// 停止任务task.stop();

// 恢复任务task.start();

// 检查状态console.log(task.isActive()); // true 或 false


croner 库

一个更现代的替代方案,从头开始用 TypeScript 编写。支持扩展语法(秒、月份名称),既可在 Node.js 中运行,也可在浏览器中运行。



安装

npm install croner


带秒的示例

import Cron from 'croner';

// 每 10 秒执行const job = new Cron('*/10 * * * * *', () => { console.log('每 10 秒执行');});

// 任务:每周一早上 8:30 执行const weeklyJob = new Cron('30 8 * * 1', () => { console.log('周一,8:30');});

// 1 分钟后停止setTimeout(() => { job.stop(); console.log('任务已停止');}, 60000);


高级功能

import Cron from 'croner';

// 带名称和时区的任务const job = new Cron('0 9 * * *', { name: 'morning-report', timezone: 'Europe/Moscow'}, () => { console.log('莫斯科早间报告');});

// 获取下次执行时间const nextRun = job.nextRun();console.log('下次执行时间:', nextRun.toISOString());

// 所有活动任务列表const activeJobs = Cron.getJobs();console.log('活动任务数:', activeJobs.length);


node-cron 与 croner 对比

  • node-cron — 久经考验的库

推荐