如何在javascript中制作定时队列

时间:2012-10-09 22:47:11

标签: javascript jquery extjs

确定。我没有这个问题的代码。我问这个是因为我是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分钟的限制但是对于第3行,计时器被重置并且它将在接下来的5分钟内保持在组合中。

5 个答案:

答案 0 :(得分: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不是真正的多线程,所以只要你确定了你的范围,就不必担心并发问题。

Check this documentation了解超时事件如何更全面地发挥作用。

答案 1 :(得分: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)

答案 2 :(得分:1)

您需要使用调用setTimeout()

的递归函数

示例:

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

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

答案 3 :(得分: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()以使用键查找现有项目并延长超时或您需要做的任何事情。

答案 4 :(得分:0)

我通过usign会话解决了这个问题。最新数据是在会话中编写的,因此新请求是根据会话中的数据进行的。我在演唱会上使用了php和js。 Js正在通过php会话阅读