变量值更改时调用函数

时间:2017-02-15 15:13:58

标签: javascript reactjs react-redux

我正在研究反应项目。我使用了videojs播放器,我得到了当前的视频时间,我将它存储在变量“currentTime”中。现在我有一个json数组,每个都有字段startTime和endTime。随着视频的进展,我想检查我的currentTime是否位于数组中任何json的startTime或endTime之间。所以我想为它做一个检查功能。当currentTime连续变化时,我设置了500 milisec的间隔来比较currentTime和startTime以及endTime。现在,如果说某些“我”(这是阵列中的一些json),介于两者之间的条件得到满足,我想将“i”存储在我的动作减速器中。至于某些时间(startTime - endTime),“i”的值将保持不变,我想将我的动作创建者只调用一个来存储“i”的值,而不是整个时间(startTime-endTime)。 / p>

我有一个以500毫秒的间隔运行的功能

setInterval(function () {
    that.state.tags.map((item, i) => {
        if( item.time <= currentTime && currentTime <= item.stopTime){
            console.log(i);
        }
    }) , 500
})

现在,当条件对特定i满意时,变量currentTime在某些时间(比如5秒)保持不变。我有一个Redux动作创建器,每当i的值发生变化时都会触发。由于i的值每500毫秒存储一次,因此我无法每500毫秒调用一次动作创建者,这与i的值相同。我想在变量i的值发生变化时通知或调用动作创建者。我该怎么做?我试过这个(下面),但这就是我提到的我不想做的事情。 markerReachedAction是我想要呼叫的动作创建者。

setInterval(function () {
    that.state.tags.map((item, i) => {
        if( item.time <= currentTime && currentTime <= item.stopTime){
            that.props.markerReachedAction(i);
            console.log(i);
        }
    }) , 500
})

1 个答案:

答案 0 :(得分:1)

认为您说每次@Transactional that.props.markerReachedAction 更改时的that.state.tags条目时,您都要致电item.time <= currentTime && currentTime <= item.stopTime例如,时间已经移动,现在而不是输入0匹配,它是条目1)。

如果是这样,as Jordan saidsetInterval可能不是正确的工具。但如果没有更多的背景,很难指出你正确的方向。

在使用setInterval时,您需要记住匹配索引的最后一个值。此外,map是用于循环遍历数组的错误工具(它构建一个新数组)。要循环播放,请使用forEach;但在您的情况下,您希望在达到条件时停止循环。通常,这将是some(通常在达到条件时停止),find(根据回调查找数组中的特定条目)或findIndex(找到基于回调的数组中特定条目的索引。在您的情况下,findIndex

let lastNotifiedIndex = -1; // -1 won't match any array index, so we'll fire the first time
setInterval(function() {
    // Find the index for which our predicate function returns true
    const index = that.state.tags.findIndex(item => item.time <= currentTime && currentTime <= item.stopTime);

    // If we found one, is it different?
    if (index !== -1 && lastNotifiedIndex !== index) {
        // Yes, notify
        lastNotifiedIndex = index;
        that.props.markerReachedAction(lastNotifiedIndex);
    }
}, 500);

我假设某个地方正在更新currentTime?如果没有,您可能希望在计时器回调开始时更新它。