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

How to pass intervalID to interval function in javascript?

本文关键字:interval 函数 intervalID javascript 中将      更新时间:2023-09-26

在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);

有谁知道正确的方法?

谢谢

你必须使用返回值,但这并不意味着变量需要可以被其他任何东西访问;只需封装:

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

上面的y只能在外部匿名函数中访问,该函数只有间隔函数,其中没有其他函数。

您甚至可以给自己一个可重用的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) {
    console.log("Interval callback called, handle is " + handle + ", args are '" + arg1 + "' and '" + arg2 + "'");
    if (++counter > 5) {
        console.log("counter > 5, stopping");
        clearInterval(handle);
    }
}, 500, "a", "b");

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

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");