如何在Nodejs中从setTimeout获取整数?

ear*_*ils 7 javascript settimeout redis node.js

关于nodejs的Timers的文档说setTimeout将返回timeoutId http://nodejs.org/api/timers.html#timers_cleartimeout_timeoutid

当我在web broswer中使用javascript时,我得到一个整数作为返回值.

var b = setTimeout(function(){console.log("Taco Bell")})
// b = 20088
Run Code Online (Sandbox Code Playgroud)

当我使用节点并做同样的事情时,返回是

var b = setTimeout(function(){console.log("Taco Bell")})
// { _idleTimeout: 60000,
//   _idlePrev: 
//     { _idleNext: [Circular],
//       _idlePrev: [Circular],
//       ontimeout: [Function] },
//   _idleNext: 
//     { _idleNext: [Circular],
//       _idlePrev: [Circular],
//       ontimeout: [Function] },
//   _onTimeout: [Function],
//   _idleStart: Wed Jan 30 2013 08:23:39 GMT-0800 (PST) }
Run Code Online (Sandbox Code Playgroud)

我想要做的是将setTimeout整数存储到redis中,然后再将其清除.所以我尝试做这样的事情

var redis = require('redis');
var redisClient = redis.createClient();
var delay = setTimeout(function(){console.log("hey")}, 20000);
var envelope  = { 'body' : 'body text', 'from' : 'test@test.com', 'to' : 'test@test.com', 'subject' : 'test subject', 'delay' : delay };
redisClient.hset("email", JSON.stringify(envelope), redis.print);
Run Code Online (Sandbox Code Playgroud)

但是后来我从JSON.stringify得到一个关于无法处理圆形对象的错误.有没有办法让setTimeout返回ID或将足够的对象存储到redis中以便以后清除?

Pas*_*cle 1

我将对 setTimeout 的调用包装到一个函数中,该函数将 setTimeout 的结果存储在一个对象中,这样您就可以通过它们的 id 检索超时。

像这样的东西:

var timeouts = {};
var counter = 0;

function setTimeoutReturnsId(callback, delay) {
  var current = counter++;
  timeouts[current] = setTimeout(function() {
      timeouts[current] = null;
      callback();
    }, delay);
  return current;
}

function getTimeoutFromId(id) {
  return timeouts[id];
}
Run Code Online (Sandbox Code Playgroud)

当然,当你的节点服务器重新启动时,你需要清除redis。