使用node-schedule时将定时任务绑定到对应对象的最佳实现方式
推荐实现方案
方案1:直接挂载到原对象(最简单直接)
如果你的ticket对象允许扩展属性,直接把任务实例挂到ticket本身是最直观的,不需要额外维护映射关系:
function setSchedule(ticket) { const date = new Date(2012, 11, 21, 5, 30, 0); // 直接把任务实例绑定到ticket对象的自定义属性上 ticket.scheduleJob = schedule.scheduleJob(date, function () { console.log('The world is going to end today.'); }); }
后续要重置/取消某个ticket的定时任务时,直接操作对应ticket的scheduleJob属性即可:
// 取消任务示例 if (ticket.scheduleJob) { ticket.scheduleJob.cancel(); } // 重置直接重新调用setSchedule给ticket.scheduleJob赋新值即可
方案2:外部Map存储映射(更解耦,不侵入原对象)
如果不想修改原ticket对象的结构,用Map做关联是性能和易用性都更好的选择,比普通对象存属性的方案更灵活:
// 全局维护ticket和定时任务的映射表 const ticketJobMap = new Map(); function setSchedule(ticket) { const date = new Date(2012, 11, 21, 5, 30, 0); const job = schedule.scheduleJob(date, function () { console.log('The world is going to end today.'); }); // 用ticket的id作为key存映射 ticketJobMap.set(ticket.id, job); }
后续操作的时候直接拿id取对应任务即可:
// 取消指定ticket的任务 const targetJob = ticketJobMap.get(ticketId); if (targetJob) { targetJob.cancel(); // 重置的话删除旧值再调用setSchedule存新的即可 ticketJobMap.delete(ticketId); }
注意事项
你写的const job[ticket.id]写法有语法错误,const声明的变量不能直接动态追加属性,要么先声明空对象const jobMap = {}再用jobMap[ticket.id]赋值,要么直接用上面的Map方案更稳妥。
内容的提问来源于stack exchange,提问作者Michael Mitch
相关产品推荐
相关产品推荐

