【发布时间】:2010-06-02 10:52:43
【问题描述】:
是否可以限制 setInterval 在 javascript 中触发的次数?
【问题讨论】:
标签: javascript
是否可以限制 setInterval 在 javascript 中触发的次数?
【问题讨论】:
标签: javascript
您可以在 x 调用后调用clearInterval():
var x = 0;
var intervalID = setInterval(function () {
// Your logic here
if (++x === 5) {
window.clearInterval(intervalID);
}
}, 1000);
为避免使用全局变量,上述改进如下:
function setIntervalX(callback, delay, repetitions) {
var x = 0;
var intervalID = window.setInterval(function () {
callback();
if (++x === repetitions) {
window.clearInterval(intervalID);
}
}, delay);
}
然后可以调用新的setInvervalX()函数如下:
// This will be repeated 5 times with 1 second intervals:
setIntervalX(function () {
// Your logic here
}, 1000, 5);
【讨论】:
clearInterval 多次放入您的回调中,并让它响应您喜欢的任何逻辑。无需返回 bool 即可获得相同的结果。
我个人更喜欢用setTimeout()隔开来达到同样的效果
// Set a function to run every "interval" seconds a total of "x" times
var x = 10;
var interval = 1000;
for (var i = 0; i < x; i++) {
setTimeout(function () {
// Do Something
}, i * interval)
}
clearInterval() 不需要清理
你可以把它括起来以避免变量泄漏,它看起来很干净:)
// Definition
function setIntervalLimited(callback, interval, x) {
for (var i = 0; i < x; i++) {
setTimeout(callback, i * interval);
}
}
// Usage
setIntervalLimited(function() {
console.log('hit'); // => hit...hit...etc (every second, stops after 10)
}, 1000, 10)
【讨论】:
您可以使用 setTimeout 和 for 循环。
var numberOfTimes = 20;
delay = 1000;
for (let i = 0; i < numberOfTimes; i++) {
setTimeout( doSomething, delay * i);
}
【讨论】:
您可以设置调用clearInterval 的超时。
这应该有效:
function setTimedInterval(callback, delay, timeout){
var id=window.setInterval(callback, delay);
window.setTimeout(function(){
window.clearInterval(id);
}, timeout);
}
【讨论】:
这将在 10 次调用后清除间隔
<html>
<body>
<input type="text" id="clock" />
<script language=javascript>
var numOfCalls = 0;
var int=self.setInterval("clock()",1000);
function clock()
{
var d=new Date();
var t=d.toLocaleTimeString();
document.getElementById("clock").value=t;
numOfCalls++;
if(numOfCalls == 10)
window.clearInterval(int);
}
</script>
</form>
</body>
</html>
【讨论】:
我为 NodeJS 做了一个小包。
https://www.npmjs.com/package/count-interval
它是 setInterval 的替代品(包括参数传递),但它需要一个额外的 count 参数。此示例每秒打印一次消息,但仅打印 3 次。
const countInterval = require('./countInterval');
const timer = countInterval(() => {
console.log('fired!', new Date());
}, 1000, 3);
【讨论】:
对于那些更喜欢 setTimeout 和喜欢递归的人,我的建议是 ;)
const setIntervalX = (fn, delay, times) => {
if(!times) return
setTimeout(() => {
fn()
setIntervalX(fn, delay, times-1)
}, delay)
}
然后按照建议您可以调用新的setInvervalX() 函数,如下所示:
// This will be repeated every for 5 times with 1 second intervals:
setIntervalX(function () {
// Your logic here
}, 1000, 5);
【讨论】:
您实际上可以非常简单地使用setTimeout() 和incremental 计数器。
var i = 0; // counter for the timer
function doSomething() {
console.log("1 second"); // your actual code here, alternatively call an other function here
if (++i < 10)
{ // only reset the timer when maximum of 10 times it is fired
console.log("reset the timer");
setTimeout(doSomething, 1000); // reset the timer
}
}
setTimeout(doSomething, 1000); // init the first
此答案基于SO: Repeating setTimeout 以及与this 的漂亮、整洁和整洁的小组合。
【讨论】:
你可以使用六
SetIntervalX:限制 setInterval 触发的次数
存储库:https://github.com/UltiRequiem/six
它包括文档、100% 的代码覆盖率和示例!
适用于 Deno、Node.js 和浏览器!
【讨论】: