nodejs的延时任务怎么实现,能用setTimeout么?

依然洋葱
  • 70

小游戏需求是,用户点击按钮,调取api接口,会判断用户等级和怪物等级,然后延时半小时去写入数据库。

伪代码如下

// 获取用户level
getUserLevel(req.id,  data =>{
    res.send({code: 0,msg: "正在打怪..."})

    //获取到level后, 延时半小时写入数据库
    setTimeout(()=> {
        //执行打怪兽逻辑,更新用户信息
        updateUserLevel(req2,  data2=> {})
    }, 1800000)    
})

我一个朋友说延时操作不能用setTimeOut,人一多进程无法释放,会蹦的
请问延时任务正确的写法应该是怎么样的?

回复
阅读 968
3 个回答

改变思路,点击后就对比等级判断战胜或战败,只是不显示在页面上,将判断时间和现在时间做对比,半小时后再显示

为啥要延迟半小时写入数据库?既然一定要写入,早写晚写有什么区别呢?

你朋友说的有道理,这里可以用两个表,一个临时表实时写入,一个往正式表里搬数据。

一个业务表 t_user_level_update_task记录用户等级更新任务执行记录,包含点击开始的时间,是否已执行标记等
使用 node-cron 这类定时任务,每10分钟(要看你们业务需要给用户体验的时间的精准度,也可以每1分钟或是更小)去业务表 t_user_level_update_task中查询所有标记为“未执行”的task list,然后:

//执行打怪兽逻辑,更新用户信息
        updateUserLevel(req2,  data2=> {})

并将已更新level的task执行标记设置为“已执行”,并记录更新时间。
over~

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏