小程序
小游戏
企业微信
微信支付
扫描小程序码分享
动态传递一个时间给定时器应该怎么做?
2 个回答
加粗
标红
插入代码
插入链接
插入图片
上传视频
// 一个任务集合 task { _id: 任务id, // Number型,自增 type: 任务类型, // String型,如:生日提醒,签到提醒 triggerTime: 触发时间, // Number型 openid: 用户openid, // String型 params: 任务参数, // Object型 isRuning: 任务是否正在执行, // Boolean型 runTime: 最后一次执行任务时间, // Number型 errCount: 任务执行出错次数, // Number型 lastError: 最后一次执行出错信息, // String型 } 假设定时器每10秒执行一次 定时器触发执行函数时,每次获取N条到达触发时间(小于等于当前时间)的,并且错误次数小于3次,并且不再执行状态的任务,进行执行 db.collection('task') .where({type:'生日提醒', triggerTime: _.lte(new Date().getTime()), isRuning: !1, errCount: _.lt(3)}) .orderBy('triggerTime', 'asc') // 按触发时间升序 .limit(5) // 这里取5条 // 更新取出的这5条记录的isRuning、runTime字段 db.collection('task').where({_id: _.in([ 这5条记录的id数组 ])}) .update({data:{isRuning: !0, runTime:new Date().getTime()}}) // 接着执行这5条的业务逻辑 // your code // 如果业务执行成功,删除对应任务记录 db.collection('task').doc(执行成功的_id).remove() // 如果业务执行出错,更新对应任务记录 db.collection('task').doc(执行成功的_id).update({data:{ isRuning: !1, triggerTime: _.inc(10*1000), // 触发时间延迟10秒 errCount: _.inc(1), // 错误次数加1 lastError: ${错误信息}, }}) // ============================ 可以说一个定时间就可以搞定了,但是你可以更加_id % N 来分流,因为_id是Number类型,自增 比如分成2个触发器 第1个触发器只处理 _id % 2 == 0 的任务 where(_.expr($.eq([$.mod(['$_id', 2]), 0]))).where({type:'生日提醒', triggerTime: _.lte(new Date().getTime()), isRuning: !1, errCount: _.lt(3)}) 第2个触发器只处理 _id % 2 == 1 的任务 where(_.expr($.eq([$.mod(['$_id', 2]), 1]))).where({type:'生日提醒', triggerTime: _.lte(new Date().getTime()), isRuning: !1, errCount: _.lt(3)})
若认为该回答有用,给回答者点个[ 有用 ],让答案帮助更多的人
你好,麻烦通过点击下方“反馈信息”按钮,提供出现问题的。
一个定时器,设置一个时间范围,然后每次触发查询这个区间内符合发送提醒的用户信息,然后循环发送提醒。(看不懂就算了)
关注后,可在微信内接收相应的重要提醒。
请使用微信扫描二维码关注 “微信开放社区” 公众号
// 一个任务集合 task { _id: 任务id, // Number型,自增 type: 任务类型, // String型,如:生日提醒,签到提醒 triggerTime: 触发时间, // Number型 openid: 用户openid, // String型 params: 任务参数, // Object型 isRuning: 任务是否正在执行, // Boolean型 runTime: 最后一次执行任务时间, // Number型 errCount: 任务执行出错次数, // Number型 lastError: 最后一次执行出错信息, // String型 } 假设定时器每10秒执行一次 定时器触发执行函数时,每次获取N条到达触发时间(小于等于当前时间)的,并且错误次数小于3次,并且不再执行状态的任务,进行执行 db.collection('task') .where({type:'生日提醒', triggerTime: _.lte(new Date().getTime()), isRuning: !1, errCount: _.lt(3)}) .orderBy('triggerTime', 'asc') // 按触发时间升序 .limit(5) // 这里取5条 // 更新取出的这5条记录的isRuning、runTime字段 db.collection('task').where({_id: _.in([ 这5条记录的id数组 ])}) .update({data:{isRuning: !0, runTime:new Date().getTime()}}) // 接着执行这5条的业务逻辑 // your code // 如果业务执行成功,删除对应任务记录 db.collection('task').doc(执行成功的_id).remove() // 如果业务执行出错,更新对应任务记录 db.collection('task').doc(执行成功的_id).update({data:{ isRuning: !1, triggerTime: _.inc(10*1000), // 触发时间延迟10秒 errCount: _.inc(1), // 错误次数加1 lastError: ${错误信息}, }}) // ============================ 可以说一个定时间就可以搞定了,但是你可以更加_id % N 来分流,因为_id是Number类型,自增 比如分成2个触发器 第1个触发器只处理 _id % 2 == 0 的任务 where(_.expr($.eq([$.mod(['$_id', 2]), 0]))).where({type:'生日提醒', triggerTime: _.lte(new Date().getTime()), isRuning: !1, errCount: _.lt(3)}) 第2个触发器只处理 _id % 2 == 1 的任务 where(_.expr($.eq([$.mod(['$_id', 2]), 1]))).where({type:'生日提醒', triggerTime: _.lte(new Date().getTime()), isRuning: !1, errCount: _.lt(3)})
若认为该回答有用,给回答者点个[ 有用 ],让答案帮助更多的人
一个定时器,设置一个时间范围,然后每次触发查询这个区间内符合发送提醒的用户信息,然后循环发送提醒。(看不懂就算了)