Storing the return value of node.js setTimeout in redis

后端 未结 3 1170
礼貌的吻别
礼貌的吻别 2021-02-13 09:48

I\'m using setTimeout in Node.js and it seems to behave differently from client-side setTimeout in that it returns an object instead of a number. I wan

3条回答
  •  孤街浪徒
    2021-02-13 10:33

    This code is used when the timeouts need not be persistent across server restarts

    var timeouts = {};
    
    app.get('/', function (req, res) {
      var index = timeouts.length;
      timeouts[index] = setTimeout(console.log, 1000000, req.user.name);
    
      redis.set('timeout:' + req.user.name, index, function (err, reply) {
        res.end();
      });
    });
    
    app.get('/clear', function (req, res) {
      redis.get('timeout:' + req.user.name, function (err, index) {
       clearTimeout(timeouts[index]);
       delete timeouts[index];
       redis.delete('timeout:' + req.user.name);
       res.end();
      });
    });
    

    If you need timeouts to be persistent across server restarts, then you might need to store _idleStart and _idleTimeout values for every timer in the redis, and load them up everytime you server restarts

    app.get('/', function (req, res) {
      var timeout = setTimeout(console.log, 1000000, req.user.name);
      var time = timeout._idleStart.getTime() + timeout._idleTimeout;
    
      redis.set('timeout:' + req.user.name, time, function (err, reply) {
        res.end();
      });
    });
    
    app.get('/clear', function (req, res) {
      redis.delete('timeout:' + req.user.name);
      res.end();
    });
    
    // Load timeouts on server start
    // *I know this is not the correct redis command*
    // *It's not accurate, only approx*
    redis.get('timeout:*', function (err, vals) {
      vals.forEach(function (val) {
        var time = val - new Date().getTime();
        setTimeout(console.log, time, username)
      });
    });
    

提交回复
热议问题