Javascript 设置并使用单个全局设置超时?

Javascript 设置并使用单个全局设置超时?,javascript,settimeout,Javascript,Settimeout,刚刚偶然发现了一条关于清除所有设置超时的评论 该评论引起了我的兴趣,因为它实际上并没有直接解决这个问题,但为跟踪多个计时器的问题提供了一个非常有趣的替代解决方案,但遗憾的是,他没有提供如何实现这一点的示例: 使用全局超时,您的所有其他函数都会从全局超时中获得定时 从…起这将使一切运行更快,更易于管理, 虽然它会给你的代码增加一些抽象 。。。我的意思是,你有一个全局超时运行每一次 50毫秒。需要定时元件的所有其他功能都将 然后从全局超时中获取它。谷歌转向了这一领域 效率,虽然我再也找不到引用它的文

刚刚偶然发现了一条关于清除所有设置超时的评论

该评论引起了我的兴趣,因为它实际上并没有直接解决这个问题,但为跟踪多个计时器的问题提供了一个非常有趣的替代解决方案,但遗憾的是,他没有提供如何实现这一点的示例:

使用全局超时,您的所有其他函数都会从全局超时中获得定时 从…起这将使一切运行更快,更易于管理, 虽然它会给你的代码增加一些抽象

。。。我的意思是,你有一个全局超时运行每一次 50毫秒。需要定时元件的所有其他功能都将 然后从全局超时中获取它。谷歌转向了这一领域 效率,虽然我再也找不到引用它的文章了

如何在全局空间中设置一个命名计时器,然后在多种情况下在其他地方引用它

例如,如果我们在全局空间中有这样的东西:

let myGlobalTimer = setTimeout(function(){ myFunc(); }, 50);
这将仅每50毫秒运行一次
myFunc


我很确定您不能将动态函数名传递到
setTimeout
中,那么如何实现这一点呢?

您可以在每次触发超时时通过数组或
Set
函数运行超时。要添加在每次迭代中运行的函数,请将其添加到
集合
;要停止其运行,请将其从
集中删除。例如:

const fns=new Set();
函数runAllTasks(){
用于(常数fn/fn){
fn();
}
//每500毫秒运行一次:
setTimeout(runAllTasks,500);
}
添加(()=>console.log('fn one running');
const fn2=()=>console.log('fn two running');
fns.增加(fn2);
runAllTasks();
//例如,1300ms后从集合中移除fn2:
设置超时(()=>{
fns.删除(fn2);

}, 1300);
您可以在每次触发超时时,通过数组或函数集运行超时。要添加在每次迭代中运行的函数,请将其添加到
集合
;要停止其运行,请将其从
集中删除。例如:

const fns=new Set();
函数runAllTasks(){
用于(常数fn/fn){
fn();
}
//每500毫秒运行一次:
setTimeout(runAllTasks,500);
}
添加(()=>console.log('fn one running');
const fn2=()=>console.log('fn two running');
fns.增加(fn2);
runAllTasks();
//例如,1300ms后从集合中移除fn2:
设置超时(()=>{
fns.删除(fn2);

}, 1300);哇,这太令人印象深刻了!因此,这样做,无论您向集合中添加多少函数,都只会运行1个setTimeout?您是否有可能使用vanilla JS而不是ES2015来推出此版本?我刚刚通过babel反编译程序运行了它,它看起来很疯狂,哈哈。@spice如果你不想使用
for..of
,你可以使用
forEach
fns.forEach(fn=>fn())
@spice这款ES2015是香草口味的JS@spice-仅当您根据所有功能完成后下一个500毫秒的剩余时间设置每个setTimeout调用的延迟时。这个答案将在最后一个函数完成后将延迟设置为500毫秒,这甚至不会提供500毫秒的延迟。哇,这太令人印象深刻了!因此,这样做,无论您向集合中添加多少函数,都只会运行1个setTimeout?您是否有可能使用vanilla JS而不是ES2015来推出此版本?我刚刚通过babel反编译程序运行了它,它看起来很疯狂,哈哈。@spice如果你不想使用
for..of
,你可以使用
forEach
fns.forEach(fn=>fn())
@spice这款ES2015是香草口味的JS@spice-仅当您根据所有功能完成后下一个500毫秒的剩余时间设置每个setTimeout调用的延迟时。此答案将在最后一个函数完成后将延迟设置为500毫秒,这甚至不会提供500毫秒的延迟。阅读一些答案并遵循一些链接将导致此调度程序:,它比下面的答案稍微复杂一点(尽管它在表示“This”时误用了术语“context”)。阅读一些答案并点击一些链接,可以找到这个调度程序:,它比下面的答案稍微复杂一些(尽管它在表示“this”时误用了术语“context”)。