2011-08-18 63 views
2

说我有下面的JavaScript代码超时:执行(在全球范围内)之前定义的延迟

var t = setTimeout(f, a); // f is an arbitrary function, a an arbitrary timeout 

一个现在可以取消设置超时:

clearTimeout(t); 

但是,它也在正常开火之前可能执行超时?

例如为:

var func = getFunctionFromTimeout(t); // Does a function like this exists? 
clearTimeout(t); 
func(); 

executeAndClearTimeout(t); // Does this one? 

回答

1

我不认为这样的功能存在......但你媒体链接保存t,为什么不救f呢?

+0

这个想法其实很简单,它从来没有跨过我的脑海......谢谢。 – dtech

0

不,这不可能。

但是,您可以编写一个setTimeoutclearTimeout的包装来实现这样的行为。

2

在服务器端,node.js setTimeout提供了比id更多的对象。我认为这是无证的领土。

当然,使用这些内部构件可能是危险的,因为它们会随着节点的发展而变化。

node 
> function x(){ console.log("hello"); } 
> z = setTimeout(x,100000) 
{ _idleTimeout: 100000, 
    _onTimeout: [Function: x], 
    _idlePrev: 
    { repeat: 100, 
    _idleNext: [Circular], 
    _idlePrev: [Circular], 
    callback: [Function] }, 
    _idleNext: 
    { repeat: 100, 
    _idleNext: [Circular], 
    _idlePrev: [Circular], 
    callback: [Function] }, 
    _idleStart: Thu, 18 Aug 2011 11:11:48 GMT } 
> 

看起来像你可以只保存z._onTimeout,清除超时,并调用_onTimeout ---但正如我所说,有可能打破一些日子。另外,nodeJS超时并不总是在需要时触发,但可以与CPUHZ网格对齐....如果你使用100hz运行linux,你将得到10ms的分辨率。我已经看到它们早晚都会发生火灾,与赫特姆提供的定时器相比。

+0

感谢您的信息,但正如您所说,与私人领域/方法混杂在一起非常危险,因为它们可能不是跨浏览器兼容的,并且可能在未来破解。准确性问题不是一个问题,因为精确度问题并不重要,而是在设置超时和几秒之后(默认情况下设置为500毫秒) – dtech