如何在JavaScript中获取所有的定时器?

6

我在不同的类中使用setTimeout()函数创建了不同的定时器。我想知道是否有一种方法可以将所有的定时器一起获取?


你不能这样做。setTimeout()setInterval() 函数会返回值,但你必须使用自己的代码来跟踪它们。 - Pointy
使用setTimeOut()的静态实现怎么样? 这可以从所有类中调用,也可以跟踪调用。 - user1615664
你必须将返回的ID存储在一个公共数组中,然后才能进行检查。 - Yogesh
您可能会发现这里提到的答案和软件包很有用:https://dev59.com/O18e5IYBdhLWcg3wHnks - Tomty
2个回答

5
默认情况下不行。你可以创建一个自定义模块来跟踪计时器并提供列表。大致意思如下:
// ES2015+ version
const activeTimers = [];
exports.setTimeout = (callback, interval, ...timerArgs) => {
    const handle = setTimeout((...args) => {
        const index = activeTimers.indexOf(handle);
        if (index >= 0) {
            activeTimers.splice(index, 1);
        }
        callback(...args);
    }, interval, ...timerArgs);
    activeTimers.push(handle);
};
exports.getActiveTimers = () => {
    return activeTimers.slice();
};

如果可以的话,使用它自己的 setTimeout 而不是全局的。


2

没有API可以获取已注册的超时,但有一种“方法”可以实现您的目标。

创建一个新函数,让我们称其为registerTimeout。确保它与setTimeout具有相同的签名。在此函数中,跟踪您需要的内容(返回的计时器ID、回调函数、超时时间等)并使用setTimeout进行注册。

现在您可以查询自己的数据结构以获取已注册的超时。

当然,您应该可能跟踪已过期/触发的超时以及已清除的超时...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接