小程序
小游戏
企业微信
微信支付
扫描小程序码分享
因为我是要实现座位预约功能,选择开始和结束时间,当时间结束的那个时间比如14点触发事件,释放座位》!?
4 个回答
加粗
标红
插入代码
插入链接
插入图片
上传视频
云触发器 + 一个任务表
触发器轮循这个任务表,每次读取N条到点需要处理的记录进行处理
config的时间你就写5秒执行一次,每次处理50条需要处理的记录
在用户订座成功后,向任务表插入一条type为1的记录
任务表结构
( _id, isRun, type, tid, triggerTime, errorCount, lastError, runTime, dateline )
_id: 任务id
isRun: 任务是否在执行中
type: 任务类型, 区分不同的任务,如1表示释放任务,2表示其他xx任务....等等
tid: 目标数据id,结合type来看,type=1,那这里tid就是座位id
triggerTime: 任务触发时间,时间戳
errorCount: 任务执行出错次数
lastError: 任务最后一次出错提示
runTime: 任务执行时间,时间戳
dateline: 插入时间,时间戳
触发器每5秒从任务表中查询50条任务类型为1、不在执行中(isRun)的、 触发时间(triggerTime)小于等于当前时间的 且 错误次数(errorCount)小于5次的 任务进行处理 // errorCount大于5次的不再处理,即每个任务最多重试4次 var res await db.colloction('task').where({ type:1, isRun: 0, triggerTime: _.lte(new Date().valueOf()) }).limit(50).get(), tasks = res && res.data && res.data.length ? res.data : [] // 递归处理方法loopUpdate var loopUpdate = async function(arr, idx){ var taskId = arr && arr[idx] ? arr[idx]._id : '', targetId = arr && arr[idx] ? arr[idx].tid : '' if(taskId && targetId){ try { // 将任务标记为正在执行isRun=1, runTime var res = await db.colloction('task').doc(taskId).update({ data:{ isRun: 1, runTime: new Date().valueOf() } }) if(res.stat.updated){ // 座位释放逻辑:更新座位状态为可选 var res2 = await db.colloction('seats').doc(targetId).update({ data:{ state: 0 } }) if(res2.stat.updated){ // 座位释放成功,删除对应任务 await db.colloction('task').doc(taskId).remove() } } } catch(e) { console.error(e) // 座位释放失败,更新对应任务isRun=0, errorCount自增1、lastError await db.colloction('task').doc(taskId).update({ data:{ isRun: 0, errorCount: _.inc(1), lastError:e } }) } } // 继续处理下一个 idx + 1 <= arr.length && await loopUpdate(arr, idx+1) } // 开始处理 await loopUpdate(tasks, 0)
若认为该回答有用,给回答者点个[ 有用 ],让答案帮助更多的人
你好,麻烦通过点击下方“反馈信息”按钮,提供出现问题的。
我有一个想法,获取当前时间的时间戳,再获取当前日期的14:00的时间戳,然后用后者减去前者,不知是否可行(感觉有点歪门邪道的味道)。
需要后端来实现了,然后后端通过api推送给前端告诉哪个座位需要释放。
释放座位设置定时器可以让后端实现
关注后,可在微信内接收相应的重要提醒。
请使用微信扫描二维码关注 “微信开放社区” 公众号
云触发器 + 一个任务表
触发器轮循这个任务表,每次读取N条到点需要处理的记录进行处理
config的时间你就写5秒执行一次,每次处理50条需要处理的记录
在用户订座成功后,向任务表插入一条type为1的记录
任务表结构
( _id, isRun, type, tid, triggerTime, errorCount, lastError, runTime, dateline )
_id: 任务id
isRun: 任务是否在执行中
type: 任务类型, 区分不同的任务,如1表示释放任务,2表示其他xx任务....等等
tid: 目标数据id,结合type来看,type=1,那这里tid就是座位id
triggerTime: 任务触发时间,时间戳
errorCount: 任务执行出错次数
lastError: 任务最后一次出错提示
runTime: 任务执行时间,时间戳
dateline: 插入时间,时间戳
触发器每5秒从任务表中查询50条任务类型为1、不在执行中(isRun)的、 触发时间(triggerTime)小于等于当前时间的 且 错误次数(errorCount)小于5次的 任务进行处理 // errorCount大于5次的不再处理,即每个任务最多重试4次 var res await db.colloction('task').where({ type:1, isRun: 0, triggerTime: _.lte(new Date().valueOf()) }).limit(50).get(), tasks = res && res.data && res.data.length ? res.data : [] // 递归处理方法loopUpdate var loopUpdate = async function(arr, idx){ var taskId = arr && arr[idx] ? arr[idx]._id : '', targetId = arr && arr[idx] ? arr[idx].tid : '' if(taskId && targetId){ try { // 将任务标记为正在执行isRun=1, runTime var res = await db.colloction('task').doc(taskId).update({ data:{ isRun: 1, runTime: new Date().valueOf() } }) if(res.stat.updated){ // 座位释放逻辑:更新座位状态为可选 var res2 = await db.colloction('seats').doc(targetId).update({ data:{ state: 0 } }) if(res2.stat.updated){ // 座位释放成功,删除对应任务 await db.colloction('task').doc(taskId).remove() } } } catch(e) { console.error(e) // 座位释放失败,更新对应任务isRun=0, errorCount自增1、lastError await db.colloction('task').doc(taskId).update({ data:{ isRun: 0, errorCount: _.inc(1), lastError:e } }) } } // 继续处理下一个 idx + 1 <= arr.length && await loopUpdate(arr, idx+1) } // 开始处理 await loopUpdate(tasks, 0)
若认为该回答有用,给回答者点个[ 有用 ],让答案帮助更多的人
我有一个想法,获取当前时间的时间戳,再获取当前日期的14:00的时间戳,然后用后者减去前者,不知是否可行(感觉有点歪门邪道的味道)。
需要后端来实现了,然后后端通过api推送给前端告诉哪个座位需要释放。
释放座位设置定时器可以让后端实现