收藏
回答

云函数触发定时器的时间可以动态设置吗?

动态传递一个时间给定时器应该怎么做?

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

3 个回答

  • 禾店科技
    禾店科技
    2021-04-28

    两个大佬提供的方法都很棒,学习到了,谢谢。

    2021-04-28
    有用 1
    回复
  • o0o有脾气的酸奶
    o0o有脾气的酸奶
    2020-07-19
    // 一个任务集合
    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)})
    

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

    2020-07-19
    有用 1
    回复 1
    • 大晨晨
      大晨晨
      2020-07-19
      好的有帮助,谢谢
      2020-07-19
      回复
  • 拾忆
    拾忆
    2020-07-18

    一个定时器,设置一个时间范围,然后每次触发查询这个区间内符合发送提醒的用户信息,然后循环发送提醒。(看不懂就算了)

    2020-07-18
    有用 1
    回复 2
    • 大晨晨
      大晨晨
      2020-07-18
      感谢提醒
      2020-07-18
      回复
    • Alan
      Alan
      2020-11-17
      这是一个很简单很聪明的思路!手动点赞!
      2020-11-17
      回复
登录 后发表内容
问题标签