javascript 停止无限循环并重新启动它

yb3bgrhw  于 2023-03-21  发布在  Java
关注(0)|答案(2)|浏览(144)

我创建了一个无限循环来检查是否满足某个时间,并相应地更改我的接口。

function infiniteloop(){
    let now = moment();
    start = moment(myStartTime);
    end = moment(myEndTime);
    if (now.isBetween(start, end)) {
        console.log('This is happening now')
    } else  {
        console.log('This is not happening now')
    }
    setTimeout(infiniteloop, 5000);
}

infiniteloop()在页面渲染时被调用。由于变量myStartTimsmyEndTime可能会发生变化,因此当它们发生变化时,需要再次调用该函数。但是它会运行多次。
所以我试着用

clearTimeout(infiniteloop);
infiniteloop();

但是这并不能解决问题。我怎样才能确保循环被停止并被再次调用呢?

jvidinwx

jvidinwx1#

这里有一个setRepeating,它与setInterval有细微的不同。setInterval调用会定期执行一些操作,而不管函数本身需要多长时间。而这个setRepeating调用会运行函数,然后 * 在函数完成后 *,它会等待整个间隔时间,然后再运行它。
这是烤一个蛋糕,然后等待一分钟,然后烤另一个蛋糕,与试图每分钟烤一个蛋糕之间的区别。
它在功能上也不同于setInterval,因为这个函数返回一个取消函数,而不是一个id,这是一个更干净的,IMO。因为你用一个定时器id做的唯一事情就是取消定时器。
要“重启”它,只需再次调用setRepeating并获得一个新的cancel函数。

const setRepeating = (fn, interval) => {
    let timer;
    const scheduleNext = () => {
        timer = setTimeout(() => {
            fn();
            scheduleNext();
        }, interval);
    }
    scheduleNext();
    return () => {
        clearTimeout(timer);
    }
}

// And here's an example of how to use it:
// Log the date, then, one second later, do it again.
cancel = setRepeating(() => console.log(new Date()), 1000);

// as an example, cancel it after 5 seconds
setTimeout(() => cancel(), 5000);
wbgh16ku

wbgh16ku2#

let timeoutId

function infiniteloop(){
   let now = moment();
   start = moment(myStartTime);
   end = moment(myEndTime);
   if (now.isBetween(start, end)) {
       console.log('This is happening now')
   } else  {
       console.log('This is not happening now')
   }
   timeoutId = setTimeout(infiniteloop, 5000);
}

infiniteloop()
.....
myStartTime = anytime1
myEndTime = anytime2
// when change the myStartTime or myEndTime do:
.....

clearTimeout(timeoutId)
infiniteloop()

相关问题