2013-05-02 48 views
2

讓我們假設我有從setTimeoutsetInterval返回的超時ID。獲取與setTimeout或setInterval關聯的函數

我能以某種方式獲得與之相關的原始功能或代碼嗎?

事情是這樣的:

var timer_id = setTimeout(function() { 
    console.log('Hello Stackoverflowers!'); 
}, 100000); 

var fn = timer_id.get_function(); // desired method 
fn(); // output: 'Hello Stackoverflowers!' 
+3

Afaik你必須圍繞'setTimeout'編寫自己的包裝。 – 2013-05-02 13:23:33

回答

2

你可以把一個包裝圍繞setTimeout - 我只是把這個在一起(測試的幾次迭代後...)

(function() { 
    var cache = {}; 

    var _setTimeout = window.setTimeout; 
    var _clearTimeout = window.clearTimeout; 

    window.setTimeout = function(fn, delay) { 
     var id = _setTimeout(function() { 
      delete cache[id]; // ensure the map is cleared up on completion 
      fn(); 
     }, delay); 
     cache[id] = fn; 
     return id; 
    } 

    window.clearTimeout = function(id) { 
     delete cache[id]; 
     _clearTimeout(id); 
    } 

    window.getTimeout = function(id) { 
     return cache[id]; 
    } 
})(); 

注意:這不會,如果工作你使用一個字符串作爲回調。但是沒有人這樣做,他們......?

它也不支持將ES5附加參數傳遞給回調函數,雖然這很容易支持。

0

的ID從setTimeout/setInterval返回只是數字,他們沒有比那些每隔數就會有其他的屬性或方法。如果你想獲得該功能,你可以先聲明它,而不是使用匿名:

var myFunc = function() { 
    console.log('Hello Stackoverflowers!'); 
}; 

var timer_id = setTimeout(myFunc, 100000); 

myFunc(); // output: 'Hello Stackoverflowers!' 

clearTimeout(timer_id); // unless you want it to fire twice 
+0

OP說他們有id,他們想獲取setTimeout ID並知道與它相關的功能。你的回答沒有回答。 – epascarello 2013-05-02 13:28:12

+0

@epascarello因爲這是不可能的,該ID只是一個數字。 – jbabey 2013-05-02 13:31:13

+1

代碼 – epascarello 2013-05-02 13:33:05

0

您可以在每個超時功能在存儲的對象,這樣就可以在以後檢索。

var timeout_funcs = {}; 

function addTimeout(func,time) { 
    var id = window.setTimeout(func,time); 
    timeout_funcs[id] = func; 
    return id; 
} 

function getTimeout(id) { 
    if(timeout_funcs[id]) 
     return timeout_funcs[id]; 
    else 
     return null; 
} 

function delTimeout(id) { 
    if(timeout_funcs[id]) { 
     window.clearTimeout(timeout_funcs[id]); 
     delete timeout_funcs[id]; 
    } 
} 
+1

有可能使用'object'來保存它的數據,而不是數組。 – Alnitak 2013-05-02 13:36:05

+0

是的你是對的 – nicolas 2013-05-02 13:54:23

+1

沒有清理? – rogerdpack 2017-04-22 04:27:32

1
var timeouts = {}; // hold the data 
function makeTimeout (func, interval) { 

    var run = function(){ 
     timeouts[id] = undefined; 
     func(); 
    } 

    var id = window.setTimeout(run, interval); 
    timeouts[id] = func; 

    return id; 
} 
function removeTimeout (id) { 
    window.clearTimeout(id); 
    timeouts[id]=undefined; 
} 
function doTimeoutEarly (id) { 
    func = timeouts[id]; 
    removeTimeout(id); 
    func(); 
} 

var theId = makeTimeout(function(){ alert("here"); }, 10000); 
console.log((timeouts[theId] || "").toString()); 
timeouts[theId](); // run function immediately, will still run with timer