如何从 Nodejs 中的 setTimeout 获取整数
How can I get an integer from setTimeout in Nodejs?
nodejs 的计时器文档说 setTimeout 将返回一个 timeoutIdhttp://nodejs.org/api/timers.html#timers_cleartimeout_timeoutid
当我在网络浏览器中使用 javascript 时,我会得到一个整数作为返回值。
var b = setTimeout(function(){console.log("Taco Bell")})
// b = 20088
当我使用 node 并做同样的事情时,返回是
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) }
我想做的是将 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);
但是后来我从 JSON.stringify 收到一个错误,说无法处理循环对象。有没有办法让 setTimeout 返回 ID 或将足够的对象存储到 redis 中以便以后清除?
我真的不相信在nodejs(我非常喜欢)中你会被迫制作这样的函数。
幸运的是,在setTimeout的返回中有一个未记录的方法(setInterval也有它!),称为close
var timer = setInterval(doSomething, 1000);
setTimeout(function() {
// delete my interval
timer.close()
}, 5000);
希望有用
我会将对 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];
}
当然,当您的节点服务器重新启动时,您需要清除 Redis 。
一直在敲打我的头,所以这里有一个现代的技巧来做到这一点:
在最新版本的节点中,节点计时器为此使用 Symbol;计时器对象有三个符号键。我需要将计时器的唯一 ID 添加到我的开发调试日志中,但是当我没有计时器系统的专用符号时,在句柄的映射中查找该字段是一个障碍。
(如果我在生产中需要易于打印的 id,那么像在公认的答案中实现整个外观是我这样做的唯一方法;但是构建该外观只是为了调试一些棘手的计时器交互并再次将其撕掉是我尝试调试的代码的太多突变。
我发现的唯一难题是使用 util.inspect 来串化不可串的,并且由于我只保留足够长的时间来调试我当前的模块,所以我不担心另一个具有相同描述性字符串的符号从发行版中潜入或添加其他库:
function getId(timer) {
var ids = Object.getOwnPropertySymbols(timer); // this currently returns three symbols
var key;
ids.forEach(id => {
if (util.inspect(id) === 'Symbol(triggerId)') key = id;
});
if (!key) throw new Error('Symbol(triggerId) not found in timer');
return timer[key];
}
- 使用 jQuery 的 .on 函数如何获取事件的原始元素
- jquery试图按名称获取按钮位置
- 如何在jQuery中获取元素的形式
- 如何在php文件中获取$.post-ajax传递的值
- setInteval vs setTimeout
- 在Shopify中获取博客文章的图片
- 使用Javascript获取所选选项ID
- 在jQuery中获取表的行索引
- 使用jquery将mysql数据获取到新的表行中
- 在动态创建的元素上获取对特定选择器的引用
- 延迟后JS setTimeout获取事件
- 可以't获取具有“t”的对象变量;这个“;由setTimeout()函数调用的对象函数中的属性
- 无法在 javascript 中获取 setTimeout 以正常工作
- Javascript-在递归函数中获取setTimeout的返回值
- 从setTimeout获取返回值
- setTimeout()获取窗口,在setTimeout激活之前显示其他脚本函数
- 获取与setTimeout或setInterval相关的函数
- 使用setInterval或setTimeout获取每x秒重复一次的函数
- 如何使用setTimeout并获取返回变量
- 如何从 Nodejs 中的 setTimeout 获取整数