更改其中一个州的值更改时间间隔

时间:2018-01-12 14:17:49

标签: javascript reactjs

someFunction() {    
     //........ some stuff

     else {
         const getData = setInterval(() => {
         this.sendRequest(id);

         if (this.state.calls === this.state.selectedItems.length) {
             this.setState({ done: true });
             clearInterval(getData);
            }
         }, this.changeInterval());
     }
},


changeInterval() {
      if(this.state.processed === true) {
            return 1000;
      } else {
            return parseInt(this.state.userSetValue, 10) * 1000 + 1000;
      } 
},

sendRequest(){
    //........ some stuff

    let {calls, processed} = this.state;
    if(!processed){
        processed = true;
    }
    calls++;

    this.setState({calls, processed});

    //........ some stuff
}

据我所知,setInverval()函数在运行函数this.sendRequest(id)后没有检查它的时间间隔是否已经改变。

我的问题是我必须在等待一段时间后运行sendRequest(),并且可以在我的应用中动态更改一些时间。目前,它仅在 FIRST 设置的时间间隔内运行。

如何在每次执行setInterval()时更改this.sendRequest(id)的时间间隔?

更新

我对someFunction()进行了一些更改:

someFunction() {
    //........ some stuff 
    else {
        let delay = parseInt(this.state.userSetValue, 10) * 1000 + 1000;
        let runFunction = () => {
                if (this.state.processed) {
                    delay = 1000;
                }
                // if (this.state.calls === this.state.selectedItems.length) {
                //     this.setState({ done: true });
                //     clearTimeout(runFunction);
                // }

                this.sendRequest();
                setTimeout(runFunction, delay);
            }
            setTimeout(runFunction, delay);
    }
}

现在的问题是:

1)代码保持无限运行而不停止(注释掉的if语句没有停止)

2)我希望第一次调用this.sendRequest()parseInt(this.state.userSetValue, 10) * 1000 + 1000时间后执行,其余连续调用在1000 ms之后执行。

我必须拨打this.sendRequest() this.state.selectedItems.length次。第一个调用始终具有parseInt(this.state.userSetValue, 10) * 1000 + 1000 ms的延迟,而其余调用具有1000 ms。

有没有人可以在第一次调用某个函数后显示如何更改定时器间隔的示例?

1 个答案:

答案 0 :(得分:0)

其中一种方法是使用setTimeout()代替setInterval()。基本思路如下:

function doWork() {
  // Do your work here

  // Schedule more work with a new delay
  var newDelay = 2000;
  doWorkAfterDelay(newDelay)
}

function doWorkAfterDelay(delay) {
  setInterval(doWork, delay)
}

var intialDelay = 1000;
doWorkAfterDelay(intialDelay);