多个javascript超时-实时数据获取问题
我正在构建一个实时系统,该系统(使用WebSocket)使用不同频率的实时数据(可以是每秒3次,可以是每2秒一次,具体取决于数据类型)更新一个表。 我目前正在努力寻找一种方法,让用户知道某个特定字段在过去5秒内没有更新。也就是说,如果没有提取新数据,我不应该将旧值保留在那里,而是将其更改为“--”或类似的值 经过漫长的javascript开发,更新字段的最终函数如下所示(极其简化): 每次需要更改字段时都会调用此函数。我有2到40个不同的字段(取决于用户)需要更改 如果未进行更新,设置计时器的最佳方法是什么,以便每5秒将字段值更改为“---” 如果能给我一些建议我会非常感激的, 谢谢多个javascript超时-实时数据获取问题,javascript,timer,real-time,websocket,Javascript,Timer,Real Time,Websocket,我正在构建一个实时系统,该系统(使用WebSocket)使用不同频率的实时数据(可以是每秒3次,可以是每2秒一次,具体取决于数据类型)更新一个表。 我目前正在努力寻找一种方法,让用户知道某个特定字段在过去5秒内没有更新。也就是说,如果没有提取新数据,我不应该将旧值保留在那里,而是将其更改为“--”或类似的值 经过漫长的javascript开发,更新字段的最终函数如下所示(极其简化): 每次需要更改字段时都会调用此函数。我有2到40个不同的字段(取决于用户)需要更改 如果未进行更新,设置计时器的最
Karol.在@Andrew的评论之后,这个答案扩展到处理多个字段(另请参见他的答案) 在每个数据中引入一个属性
updateTime
,该属性保存上次更新数据的时间。定期计时器检查所有数据的updatetime
,并在适当时更新文本字段。检查频率必须是检测周期的两倍。函数changeValue()
更新updatetime
和文本字段
function checkData() {
var now = new Date.getTime();
for "each data" {
if (now - data.updatedTime >= 5000) {
var fieldId = data.fieldId;
$('span#'+fieldId).text('--');
}
}
}
function changeValue(data) {
var fieldId = data.fieldId;
var value = Math.round(data.value);
$('span#'+fieldId).text(value);
data.updatedTime = new Date.getTime();
}
// Install periodic timer to check last updates:
setInterval(checkData, 5000 / 2); // interval = half the required detection period
由于您希望根据每个字段指示超时,因此有两个明显的选项:
var lastUpdatedTimes = {};
function changeValue(data){
var fieldId= data.fieldId;
var value = Math.round(data.value);
$('span#'+fieldId).text(value);
lastUpdatedTimes[fieldId] = new Date().getTime();
}
然后设置一个间隔计时器来检查每一个
function checkFieldsForTimeout(){
var now = new Date.getTime();
// For each ID in lastUpdatedTimes, see if 'now minus
// last updated' is > 5000 and is so, set the field
// text to '--' and remove that entry from the last
// updated list with "delete lastUpdatedTimes[itemId]".
}
如果一个超时字段恢复使用,“-”将再次被一些真实文本替换
通过在字段中输入“-”时从“lastUpdatedTimes”中删除上次更新的时间,我们可以确保间隔计时器不会浪费时间处理已经超时的字段。创建一个对象,该对象将保存字段上次更新时的时间。这样,您可能只需要1次超时-这是必须检查的最短时间之一。检查对象,必要时更新字段。或者我不理解您的观点,或者您需要的是一个变量,比如handler=setInterval(setTo'--,5000);,并在每个changeValue调用中清除/设置处理程序。它是?看,你说“更改字段的值”,然后说“更改字段的值”,所以我不知道你需要哪一个。我认为这不起作用,甚至忽略了“checkData()”中“data”不可用的问题。OP似乎在为各个字段请求超时。在您的情况下,其中一个字段可能在十分钟内不会更新,但只要其他字段每秒更新一次,您的全局更新计时器就会不断变化。代码中的任何内容都不会返回到第一个暂停的字段并更新其值以指示特定于字段的超时。是的,您是对的。我的回答只处理了一个数据(我没有意识到需要多个数据)。对多个数据的扩展当然很简单。我对你的回答和评论投了赞成票。谢谢你的评论!真是太棒了!简单的绝妙解决方案;)万分感谢!是否需要删除LastUpdateTimes[itemId]?如果您这样做,您需要首先检查是否存在。如果您不删除该条目,那么下次在间隔计时器周围,它将重新检查同一条目,仍然认为它已超时,并且不必要地再次使用“-”更新其文本。这会浪费CPU时间,而且如果很多字段超时,那么在每个间隔内更新字段的速度可能会非常慢。使用“delete”时,您不需要首先检查是否存在,但无论如何,它必须存在,因为您正在从迭代对象属性的循环中删除它……如果您担心删除项后JS引擎可能无法正确枚举所有属性,那么(1)您可能不在乎,因为间隔计时器将很快再次运行,或者(2)您可以将“lastUpdatedTimes”中的条目设置为“null”或其他神奇的无操作值,并在checkFieldsForTimeout属性枚举循环中检查该值。(2) 我觉得很难看,尤其是考虑到(1)。
function checkFieldsForTimeout(){
var now = new Date.getTime();
// For each ID in lastUpdatedTimes, see if 'now minus
// last updated' is > 5000 and is so, set the field
// text to '--' and remove that entry from the last
// updated list with "delete lastUpdatedTimes[itemId]".
}