Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/24.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
Reactjs 最后一次反应中的SetTimeout小于预期值_Reactjs - Fatal编程技术网

Reactjs 最后一次反应中的SetTimeout小于预期值

Reactjs 最后一次反应中的SetTimeout小于预期值,reactjs,Reactjs,我的应用程序计时器有问题。简而言之,我有一个计时器,它在15秒后通过设置“可见性:false”来更改组件的状态。到现在为止,一直都还不错。 当我在15秒之前调用函数时,问题就出现了。在这种情况下,计时器不会持续15秒,事实上,组件会在几秒钟后消失。 我认为“旧”计时器(可能仍处于活动状态)和“新”计时器之间存在干扰问题。 我该如何避免这种情况?我想定时器是干净的,一旦我调用另一个函数(甚至是同一个),然后再开始超时。 我希望我是清楚的。 为更清楚起见,我附上相关代码部分 import Reac

我的应用程序计时器有问题。简而言之,我有一个计时器,它在15秒后通过设置“可见性:false”来更改组件的状态。到现在为止,一直都还不错。 当我在15秒之前调用函数时,问题就出现了。在这种情况下,计时器不会持续15秒,事实上,组件会在几秒钟后消失。 我认为“旧”计时器(可能仍处于活动状态)和“新”计时器之间存在干扰问题。 我该如何避免这种情况?我想定时器是干净的,一旦我调用另一个函数(甚至是同一个),然后再开始超时。 我希望我是清楚的。 为更清楚起见,我附上相关代码部分

import React,{Component}来自“React”;
类Pubblicita扩展组件{
状态={
索引:0,
IFramesrc:[“/300x250”、“/160x600”、“/468x60”],
高度[25060060],
宽度[300160468],
可见性:错误,
leftSrcs:[115050500],
rightSrcs:[0,0,0],
topSrcs:[10,10500]
};
componentDidMount(){
document.addEventListener(“keydown”,this.onKeyDown.bind(this));
}
组件将卸载(){
document.removeEventListener(“keydown”,this.onKeyDown.bind(this));
}
onKeyDown(事件){
如果(event.keyCode===17){
这个。重载();
}
如果(event.keyCode===96){
this.setState({index:0,visibility:true});
}
如果(event.keyCode===97){
this.setState({index:1,visibility:true});
}
如果(event.keyCode===98){
this.setState({index:2,visibility:true});
}
这个.timer();
}
计时器(){
设置超时(()=>{
this.setState({visibility:false});
}, 15000);
}
重新加载(){
常量iframeLength=this.state.iframeSrcs.length;
if(this.state.index}
是的,你是对的。问题是你没有清除上一个超时。这是如何解决此问题的示例是的,你是对的。问题是你没有清除上一个超时。这是如何在触发新计时器之前解决此问题的示例

timer() {
    if (this.timeout) {
        clearTimeout(this.timeout);
    }

    this.timeout = setTimeout(() => {
        this.setState({ visibility: false });
    }, 15000);
}
在触发新计时器之前先触发旧计时器

timer() {
    if (this.timeout) {
        clearTimeout(this.timeout);
    }

    this.timeout = setTimeout(() => {
        this.setState({ visibility: false });
    }, 15000);
}