如何在javascript中将intervalID传递给interval函数?

时间:2016-03-10 15:25:26

标签: javascript settimeout setinterval

在我创建一个间隔的javascript中,我想从函数内部停止间隔,但我不想像这样从外部引用ID值

var y = setInterval(function(){ clearInterval(y); }, 1000);

我想要的是传递一个类似于这种风格的变量

setTimeout(function(data){alert(data);}, 1000, "data");

这也适用于setInterval,除了我无法真正传递setInterval函数返回的id值,因为它是在调用它之后创建的。

现在我正在做这样的黑客攻击:

var r = [];
var y = setInterval(function(r){ if (r.length==1) { clearInterval(r[0]); } }, 1000, r);
r.push(y);

有没有人知道正确的方法?

由于

2 个答案:

答案 0 :(得分:4)

您必须使用返回值,但这并不意味着该变量需要对其他任何内容都可访问;只是封装:

(function() {
    var y = setInterval(function(){ clearInterval(y); }, 1000);
})();
上面的

y只能 在外部匿名函数中可访问,该函数只有interval函数而且没有其他内容。

您甚至可以给自己一个可重复使用的setInterval包装器来执行此操作:

function setIntervalWrapper(callback, time) {
    var args = Array.prototype.slice.call(arguments, 1);
    args[0] = setInterval(function() {
        callback.apply(null, args);
    }, time);
}

这会将时间句柄作为第一个参数传递给您指定的任何其他参数。它还具有可靠地跨浏览器支持这些后续参数的好处(一些旧的浏览器不支持将参数传递给回调)。

无端的例子:

function setIntervalWrapper(callback, time) {
  var args = Array.prototype.slice.call(arguments, 1);
  args[0] = setInterval(function() {
    callback.apply(null, args);
  }, time);
}

var counter = 0;
setIntervalWrapper(function(handle, arg1, arg2) {
  snippet.log("Interval callback called, handle is " + handle + ", args are '" + arg1 + "' and '" + arg2 + "'");
  if (++counter > 5) {
    clearInterval(handle);

  }
}, 500, "a", "b");
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="//tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

答案 1 :(得分:0)

您可以创建一个新方法,它可以为您提供所需的功能,例如

window.createInterval = function(cb, timeout, data) {
  if (typeof cb !== "function") {
    throw new Error("Please provide a callback.");
  }

  var interval = window.setInterval(function(data) {
    cb(data, interval);
  }, timeout || 0, data);

  return interval;
};

现在这就像

var myInterval = window.createInterval(function(data, interval){
  console.log(data, interval);
}, 1000, "Hello");

打印 Hello和间隔ID(与myInterval相同)

window.createInterval = function(cb, timeout, data) {
  if (typeof cb !== "function") {
    throw new Error("Please provide a callback.");
  }

  var interval = window.setInterval(function(data) {
    cb(data, interval);
  }, timeout || 0, data);

  return interval;
};

var myInterval = window.createInterval(function(data, interval) {
  document.write(data + " " + interval + " " + myInterval);
  window.clearInterval(interval);
}, 1000, "Hello");