[英]How to reset and start setTimeout()
多亏了在线帮助,我制作了一个 RT web 应用程序,现在我只完成了一个运行不佳的部分。 当 function 每秒调用一次并有新数据时,文本的颜色应为“红色”,三秒后应返回相同的颜色。 如果值没有每秒都在变化,那么它是有效的,但是当值在变化时,事情就不能正常工作了。 值的颜色变为黑色,然后变为红色。 它没有保持相同的价值。 实时更新有效,唯一的问题是每秒都有新数据时颜色不保持相同的颜色。
<script>
setInterval(function() {
fetch('/data_json').then(
response => response.json()
).then(
data =>
data.forEach(match =>
updateElement(match)
)
)
}, 1000
);
function updateElement(match) {
Object.entries(match).forEach(([k,v]) => {
if(document.getElementById(k + '_' + match.id) != null){
element = document.getElementById(k + '_' + match.id);
previousValue = element.innerHTML;
// If Previous value is not equal to the new value, change it!
if (previousValue !== v.toString()) {
blinkUpdate(element, v.toString())
}
}
})
}
function blinkUpdate(element, newValue, newColor='#FF2400') {
previousColor = element.style.color;
var start_Time=null;
element.innerHTML = newValue;
element.style.color = newColor;
if(newColor==previousColor){
clearTimeout(start_Time)
}else{
// Set back to original color after timeout ms
start_Time=setTimeout(() => {
element.style.color = '#000000'
}, 3000)
}
}
</script>
那么问题来了,当function有新的呼叫时,如何重置定时器呢? 新的呼叫应该重置超时。 颜色应该保持不变。
主要问题是您将start_Time
计时器引用存储在 function 中。下次 function 运行时该引用将消失,因此当您执行clearTimeout
时,它根本不会清除任何内容。
有一种完全不同的方法来实现这个可能会更好——但我不想让你出轨,或者……
您可以将计时器存储在 map 中,并与 function 外部字段的 ID 相对应,并在其中引用它们。 这样你就有了一个计时器存储,每个计时器都根据元素的 id 存储。 因此,在间隔的每个“滴答声”之间,您可以参考要取消的确切计时器。
我还认为,当新数据在红色时到达时,您可能只希望它重置 3 秒? 所以它应该清除它并重新设置它。
<script>
setInterval(function() {
fetch('/data_json').then(
response => response.json()
).then(
data =>
data.forEach(match =>
updateElement(match)
)
)
}, 1000
);
function updateElement(match) {
Object.entries(match).forEach(([k,v]) => {
if(document.getElementById(k + '_' + match.id) != null){
element = document.getElementById(k + '_' + match.id);
previousValue = element.innerHTML;
// If Previous value is not equal to the new value, change it!
if (previousValue !== v.toString()) {
blinkUpdate(element, v.toString())
}
}
})
}
const timers = {}
function blinkUpdate(element, newValue, newColor='#FF2400') {
previousColor = element.style.color;
var start_Time=null;
element.innerHTML = newValue;
element.style.color = newColor;
if(timers[element.id] && previousColor !== newColor){
clearTimeout(timers[element.id])
}
// Set back to original color after timeout ms
timers[element.id] = setTimeout(() => {
element.style.color = '#000000'
delete timers[element.id]
}, 3000)
}
</script>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.