2

行。我没有这个问题的代码。我问这个是因为我是 javascript 新手。我想知道如何在 JS 中创建定时队列。这是诀窍。

我有一个组合框。组合框后面有 extjs 数据存储,它每 5 秒用新数据更新一次,即组合将获得新的行条目。

行条目可以是 1,2 和 3 三种类型。可以有多个相同类型但具有不同行 ID 的行。如果 5 分钟内没有更新,则每行都将从组合中删除。这意味着如果我从商店获得类型 3 的新行,它将在组合中停留 5 分钟。如果在获取的新数据中出现相同的行(具有相同的 id 和类型),则 5 分钟计时器将重置并再次计数 5 分钟。等等。

如何在 javascript 中实现此功能。

不明白的请写评论。

这是一个例子:

row_1 type1 5 min timer start
row_2 type1 5 min timer start
row_3 type3 5 min timer start
row_2 type2 5 min timer start

这是当前获取的数据的示例。3分钟后,我得到了这个数据。

row_3 type3 5 min timer start

其余的行计时器将继续运行,直到达到 5 分钟的限制,但对于第三行,计时器将被重置,它将在接下来的 5 分钟内停留在组合中。

4

5 回答 5

3

您将必须在这里跟踪两件事:实际项目,以及上次更新的时间(或者更准确地说,将更新它的超时事件。

timeouts = [];
elems = [];
function updateElem(no){
    //Do your update on elems[no]
    clearTimeout(timeouts[no]);
    timeouts[no] = setTimeout(function(){ removeElem(no) }, 5*60*1000 );
}
function removeElem(no){
    //Remove the element.
}

这展示了基本概念。有很多更好的方法可以将所有内容联系在一起,但基本思想是:

  • 在对象上设置超时以在五分钟后将其删除
  • 更新对象时:
    • 清除之前的超时
    • 设置新的超时

因为 JS 并不是真正的多线程,所以您不必担心并发问题,只要您确定了范围。

查看此文档以更全面地了解超时事件是如何工作的。

于 2012-10-09T23:09:56.673 回答
1

别的地方:

function ComboRemoval(id)
{
    Lookup your combobox (document.findelementbyid perhaps)
    Find element with value "id"
    remove it
}

向组合框添加元素时:

Add the element
setInterval(function() { ComboRemoval(1234)}, 300000);  //FIXED AS PER COMMENTS BELOW

setInterval 将在 5 分钟内触发 ComboRemoval 函数,并从框中删除 ID 1234。

300000 = 5 分钟(1000 = 1 秒,60 x 5 = 300 秒,300 x 1000 = 300000)

于 2012-10-09T22:52:28.787 回答
1

您需要使用调用 setTimeout() 的递归函数

例子:

function myFunc() {
    var minutes = 5;
    //do stuff here
    setTimeout(function() { myFunc() }, minutes*60000 }; 
}

调用时 myFunc() 将触发,然后在 5 分钟计时器上调用自身。其余程序逻辑 100% 取决于最终结果。

于 2012-10-09T22:58:39.337 回答
1

基于@Gherkin 的回答,使用 jQuery:

function addOption(key, text, timeout) {

    var el = $("<option></option>")
         .attr("value",key)
             .text(text);
    ​$('#test').append(el);
    setTimeout(function() { el.remove(); }, timeout);
}

现在您可以致电:

addOption("value", "Text for option", 2000);

看看它在行动:http: //jsfiddle.net/um9Cu/

您可以扩展 addOption() 以使用密钥查找现有项目并延长超时时间,或者您需要做的任何事情。

于 2012-10-09T23:12:06.493 回答
0

我通过使用签名会话解决了这个问题。最新的数据是在 session 中写入的,所以新的请求是根据 session 中的数据来的。我同时使用了 php 和 js。Js 正在通过 php 会话读取

于 2013-04-13T16:21:36.697 回答