-->

开始使用的setTimeout或setInterval的相关功能(Get function asso

2019-09-01 18:34发布

让我们假设我有一个从返回超时ID setTimeoutsetInterval

我能以某种方式,原有的功能或代码,与它相关联?

事情是这样的:

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

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

Answer 1:

你可以把周围的包装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额外的参数给回调函数,虽然这很容易支持。



Answer 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


Answer 3:

您可以存储每个超时功能中的对象,这样就可以在以后检索。

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


Answer 4:

从返回的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


文章来源: Get function associated with setTimeout or setInterval