我有一个端点,该端点发布了IoT设备发送新阅读数据的请求。我正在使用PubNub平台。
第一次尝试,当我收到成功响应时,我的clearTimeout函数会正确取消计时器,并且不会更新状态以显示错误消息。但是,每次我尝试第二次执行请求时,clearTimeout函数都无法停止计时器。我得到了成功的响应,但是随后我也得到了超时响应,该响应向用户显示了错误消息。
handleCheckSensor(){
if(CancelTimeout){
clearTimeout(CancelTimeout)
}
this.setState({displayGraphs: false})
this.setState({message: null, error: null})
const user = this.state.user[0]
this.pubnub.subscribe({
channels: [user.channel],
withPresence: true,
})
const CancelPubNub = () => {
this.setState({isCheckingSensor: false, error: "your request timed out. It appears device did not respond."})
this.pubnub.unsubscribe({
channels: [user.channel],
})
}
const CancelTimeout = setTimeout(CancelPubNub, 15000);
this.pubnub.getMessage(user.channel, (message) => {
clearTimeout(CancelTimeout)
this.setState({message: message, isCheckingSensor: false})
})
... }
答案 0 :(得分:1)
由于范围隔离,您需要在此函数之外声明超时ID CancelTimeout
。现在CancelTimeout
是局部变量,仅在该函数运行时创建。好的地方应该在组件中的this
上。像this.CancelTimeout
之类的东西。