【发布时间】:2020-07-21 05:27:32
【问题描述】:
我在 NodeJS 中使用 setInterval(),发现它返回了一个包含一些信息的 Timeout 对象,其中之一是 Symbol(asyncId)。
什么是Symbol(asyncId),是否可以将其用作对clearInterval() 的区间的引用?如果有,怎么做?
这是我当前的代码:
interval = setInterval(async function () {
prepareObj(message);
console.log(interval);
const intervalID = Reflect.ownKeys(interval).find(
(key) => key.toString() === "Symbol(asyncId)"
);
await saveID(message, interval[intervalID]);
}, 5000);
setInterval() 正在运行多次,我需要另一种方法来清除每个单独的间隔,因为 interval 将被重新分配以包含最新的 Timeout 对象。我尝试将Symbol(asyncId) 的值存储在 SQLite DB 中,以便稍后访问该值以清除间隔但没有成功。
地图尝试
let intervals = new Map();
interval = setInterval(async function () {
prepareCard(message);
console.log(interval);
await saveID(message, interval);
}, 5000);
async function saveID(message, id) {
intervals.set(`${message.channel.id}`, { interval });
}
// Clearing interval
const objToClear = intervals.get(channel);
console.log(objToClear);
const clear = clearInterval(objToClear["interval"]);
console.log(clear);
调用clearTimeout()时,我只清除最近设置的区间,而不是目标区间。
【问题讨论】:
-
是的,无论 setInterval 返回什么,您都可以使用 clearInterval。
-
鉴于it's not documented,我强烈建议不要这样做。为什么除了
Timeout对象之外还需要其他引用? -
我不确定你使用的是什么浏览器,但是返回值通常是一个数值,符号是一个唯一的标识符,要获得一个你需要原始符号的值。我们可能需要更多的上下文。
-
他使用的是node.js,而不是浏览器,它确实是一个对象。但使用模式完全一样。
-
查看这个答案。我认为他们正在做你想做的事。 stackoverflow.com/a/51526843/1495198
标签: javascript node.js sqlite serialization settimeout