获取与setTimeout或setInterval关联的函数

时间:2013-05-02 13:20:50

标签: javascript timer settimeout setinterval

我们假设我有从setTimeoutsetInterval返回的超时ID。

我能以某种方式得到与之相关的原始函数或代码吗?

这样的事情:

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

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

4 个答案:

答案 0 :(得分:3)

你可以在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附加参数传递给回调函数,尽管这很容易支持。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

您可以将每个超时功能存储在一个对象中,以便以后检索它。

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];
    }
}

答案 3 :(得分:0)

setTimeout / setInterval返回的ID只是数字,除了每个其他数字都有的属性或方法之外,它们没有任何属性或方法。如果你想获得该功能,你可以先声明它而不是使用匿名:

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