我正在研究反应项目。我使用了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
})
答案 0 :(得分:1)
我认为您说每次@Transactional
that.props.markerReachedAction
更改时的that.state.tags
条目时,您都要致电item.time <= currentTime && currentTime <= item.stopTime
例如,时间已经移动,现在而不是输入0匹配,它是条目1)。
如果是这样,as Jordan said,setInterval
可能不是正确的工具。但如果没有更多的背景,很难指出你正确的方向。
在使用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
?如果没有,您可能希望在计时器回调开始时更新它。