2011-08-18 116 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