Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从setInterval运行函数一次_Javascript_Setinterval - Fatal编程技术网

Javascript 从setInterval运行函数一次

Javascript 从setInterval运行函数一次,javascript,setinterval,Javascript,Setinterval,我有一个setInterval函数,它计算某个日期和当前时间之间的差值。当这个差异达到不到一个小时时,我想运行一些只应该执行一次的代码 const countdownDate=新日期('2021年3月15日11:30:00')。getTime(); 常数小时(以毫秒为单位)=3600000; 让ticker=setInterval(()=>{ 现在让我们=new Date().getTime(); 让持续时间=倒计时日期-现在; if(持续时间{ if(持续时间{ log('这将只运行一次');

我有一个
setInterval
函数,它计算某个日期和当前时间之间的差值。当这个差异达到不到一个小时时,我想运行一些只应该执行一次的代码

const countdownDate=新日期('2021年3月15日11:30:00')。getTime();
常数小时(以毫秒为单位)=3600000;
让ticker=setInterval(()=>{
现在让我们=new Date().getTime();
让持续时间=倒计时日期-现在;
if(持续时间<小时,以毫秒为单位){
log('这将继续运行');
}
如果(持续时间==0){
清除间隔(股票代码);
}
}, 1000);
我发现实现这一点的一种方法是设置一个全局标志,该标志在函数运行一次后翻转

let bar=false;
函数foo(){
如果(!巴){
log('这将只运行一次');
}
bar=真;
}
让ticker=setInterval(()=>{
if(持续时间<小时,以毫秒为单位){
foo();
}
}, 1000);
另一种工作方式是触发自定义事件并注册一次性事件处理程序。但是,我不确定每秒触发一次事件是否比以前的解决方案性能差

const foo=新事件('foo');
document.addEventListener('foo',()=>{
log('这将只运行一次');
},{once:true});
让ticker=setInterval(()=>{
if(持续时间<小时,以毫秒为单位){
文件。调度事件(foo);
}
}, 1000);

我想一定有更好的方法来实现期望的行为。我知道在
设置间隔内只运行一次并不是最佳做法,但到目前为止,我还没有找到任何其他解决方法。

您可以使用递归函数

const start=(停止,在下面)=>{
让低于小时=低于小时;
const countdownDate=新日期('2021年3月15日11:30:00')。getTime();
常数小时(以毫秒为单位)=3600000;
如果(!停止){
setTimeout(函数(){
现在让我们=new Date().getTime();
让持续时间=倒计时日期-现在;
如果(!小时以下){
if(持续时间<小时,以毫秒为单位){
log('这将继续运行');
低于小时=真;
}
}
开始(持续时间===0,不足一小时);
},1000)
}
} 
//-----------
开始()

我认为您可以使用递归函数,其中包含settimout,并将标志作为永久参数传递。这是
setInterval
的一个很好的替代方法,谢谢。但是,在您提供的示例中,代码将一直运行,直到持续时间达到0。我只希望在持续时间不到一小时后执行一次代码,我应该提到的是,我也要求间隔在这一点之后继续。在调用函数之前,你可以传递到permeters函数一个停止,一个运行代码我将编辑我的代码我不确定我是否理解
参数下的
正在做什么,这是在调用
start()
时传入的布尔值吗?因为在我的例子中,持续时间是动态计算的,所以你不可能知道持续时间提前了一个小时。就可读性而言,这是我遇到的另一个问题。我觉得一次性事件处理程序更容易理解和维护,我将其作为secound参数传递,以运行另一段代码,并保持“start”函数运行