构建嵌套的间隔循环

时间:2016-01-19 15:42:40

标签: reactjs setinterval

我想构建一个每天触发的间隔循环。在这个循环中应该再次是一个间隔循环,每20分钟触发一次。所以现在,我很好奇,如果我能像这样构建它:

updatePeriodically() {
    window.setInterval(() => {
        console.log('Fetch daily sensor update!')
        getInitData()
            .then((results) => {
                this.setState({ dataSensor: results })      
            })
            window.setInterval(() => {
                console.log('Fetch 20 minute sensor update')
                getData()
                    .then((results) => {
                        this.setState({ dataSensor: results })
                })
            }, UPDATE_INTERVAL)

    }, DAILY_INTERVAL)
} 

我只是想知道,如果每天触发一个新的20分钟间隔循环并且不会停止旧循环,那么最后几天后,我有四个20更新循环?或者也许有人知道,如何更好地做到这一点?

1 个答案:

答案 0 :(得分:1)

我猜你可以通过检查间隔是否已经开始(你的内部间隔),或者只使用一个间隔并且每隔多次重复一次getInitdata来优化你的间隔计时器,如下:

updatePeriodically() {
    var remaining = 0;
    window.setInterval(() => {
        if (remaining <= 0) {
            console.log('Fetch daily sensor update!');
            getInitData().then((results) => {
                this.setState({ dataSensor: results });
            });
            remaining = DAILY_INTERVAL;
        } else {
            remaining -= UPDATE_INTERVAL;
            console.log('Fetch 20 minute sensor update');
            getData().then((results) => {
                this.setState({ dataSensor: results });
            });
        }
    }, UPDATE_INTERVAL);
} 

这样做的好处是它只使用1个循环来进行定期更新,并且不会启动额外的间隔。

但我建议不要在组件内创建此更新循环。我假设您要显示的数据由商店管理,您应该有一个运行此“轮询”更新的中心位置,以便所有组件一次获取新数据,而不是实现此类轮询的每个组件功能。奖励是所有依赖于此数据的组件同时获取其新状态数据。