第二次尝试clearTimeout无法执行

时间:2018-07-25 19:43:10

标签: reactjs pubnub cleartimeout

我有一个端点,该端点发布了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})

  }) 

... }

1 个答案:

答案 0 :(得分:1)

由于范围隔离,您需要在此函数之外声明超时ID CancelTimeout。现在CancelTimeout是局部变量,仅在该函数运行时创建。好的地方应该在组件中的this上。像this.CancelTimeout之类的东西。