4

setTimeoutまたはからタイムアウト ID が返されたとしsetIntervalます。

それに関連付けられている元の関数またはコードを何らかの方法で取得できますか?

このようなもの:

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

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

4 に答える 4

4

ラッパーを配置できます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 の追加パラメーターをコールバック関数に渡すこともサポートしていませんが、これは簡単にサポートできます。

于 2013-05-02T13:39:21.577 に答える
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
于 2013-05-02T13:36:34.323 に答える
0

setTimeout/から返される IDsetIntervalは単なる数値であり、他のすべての数値が持つもの以外のプロパティやメソッドはありません。その関数を取得したい場合は、匿名を使用する代わりに最初に宣言できます。

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
于 2013-05-02T13:24:23.670 に答える