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 或 falsecroner 库
一个更现代的替代方案,从头开始用 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 — 久经考验的库