收藏
回答

setTimeout是延时触发,如果要实现在特定的时间触发事件,比如我要在14点触发事件?大概咋办呀

因为我是要实现座位预约功能,选择开始和结束时间,当时间结束的那个时间比如14点触发事件,释放座位》!?

回答关注问题邀请回答
收藏

4 个回答

  • o0o有脾气的酸奶
    o0o有脾气的酸奶
    2020-04-23

    触发器 + 一个任务表

    触发器轮循这个任务表,每次读取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)
    
    
    

    若认为该回答有用,给回答者点个[ 有用 ],让答案帮助更多的人

    2020-04-23
    有用 3
    回复 5
    • ck
      ck
      2020-04-23
      嗯嗯,做毕设的新手,我百度一下怎么弄
      2020-04-23
      回复
    • o0o有脾气的酸奶
      o0o有脾气的酸奶
      2020-04-24回复ck
      觉得有用的话,点个[有用]
      2020-04-24
      1
      回复
    • ck
      ck
      2020-04-24回复o0o有脾气的酸奶
      就是我是本来已经是实现了座位的手动取消,所以本来想法是定时实现在特定的时间触发这个取消的事件就行了,我看到到您发的这个思路,应该是我在选择座位的时候添加参数type=1的,还有把预约结束的时间endtime加入数据库,然后在云函数的时候用where将type=1和当前时间就是时间戳获取到的时间等于预约结束的时间的数据拿出来,进行取消操作!?大概是这个意思吗,如果理解错的请您指导一下,!这个定时触发器也是第一次接触,不是很懂用,而且我刚才我用时间戳和向数据库添加数据测试了一下,就是没五秒向数据库添加一个时间数据,但是数据库列表没有实现添加数据
      2020-04-24
      回复
    • ck
      ck
      2020-04-24回复o0o有脾气的酸奶
      这是我的取消代码,x、y、id都可以通过数据库拿到进行操作,然后remove座位的数据库信息后,页面的改变是通过改变每个座位的color的值然后放在data里面,然后通过wxml的for来渲染data里面的座位信息,来实现刷新页面
      2020-04-24
      回复
    • o0o有脾气的酸奶
      o0o有脾气的酸奶
      2020-04-25回复ck
      座位的信息不用remove吧,加个状态,状态:0空闲,1已被预订,取消预订就改变座位状态就行
      2020-04-25
      回复
  • 风起九万里
    风起九万里
    2020-06-01

    我有一个想法,获取当前时间的时间戳,再获取当前日期的14:00的时间戳,然后用后者减去前者,不知是否可行(感觉有点歪门邪道的味道)。

    2020-06-01
    有用 1
    回复 1
    • 彭小黑
      彭小黑
      2020-09-01
      我第一想法就是这个
      2020-09-01
      回复
  • Wang
    Wang
    2020-04-23

    需要后端来实现了,然后后端通过api推送给前端告诉哪个座位需要释放。

    2020-04-23
    有用 1
    回复
  • 俞哄哄💻📷🤘🚴🎧
    俞哄哄💻📷🤘🚴🎧
    2020-04-23

    释放座位设置定时器可以让后端实现

    2020-04-23
    有用
    回复 3
    • ck
      ck
      2020-04-23
      大佬问一下,那个定时触发器的触发时间就是config可以写活吗,就是可以在js里面将要你设置的定时时间传到里面,因为每个座位要实现定时触发的时间不一样?
      2020-04-23
      回复
    • o0o有脾气的酸奶
      o0o有脾气的酸奶
      2020-04-24回复ck
      config的时间写死就行,看我最上面的回答
      2020-04-24
      回复
    • ck
      ck
      2020-04-24回复o0o有脾气的酸奶
      嗯,我懂这个config的意思啦,谢谢
      2020-04-24
      回复
登录 后发表内容
问题标签