2

Ok。この質問のコードはありません。私はjavascriptに慣れていないので、これを求めています。JSで時限キューを作成する方法を教えてください。これがトリックです。

コンボボックスがあります。コンボボックスにはextjsデータストアがあり、5秒ごとに新しいデータで更新されます。つまり、コンボは新しい行エントリを取得します。

行エントリには、1、2、および3の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分間はコンボに留まります。

4

5 に答える 5

3

ここで 2 つのことを追跡する必要があります: 実際のアイテムと、最後に更新されたとき (または、より正確には、アイテムを更新するタイムアウト イベント.

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.
}

これは、基本概念を示しています。すべてを結び付けるにはもっと良い方法がありますが、基本的な考え方は次のとおりです。

  • オブジェクトにタイムアウトを設定して、5 分後にオブジェクトを削除します
  • オブジェクトを更新する場合:
    • 前のタイムアウトをクリアする
    • 新しいタイムアウトを設定する

JS は真のマルチスレッドではないため、スコープを把握している限り、同時実行の問題について心配する必要はありません。

このドキュメントをチェックして、タイムアウト イベントがより完全な意味でどのように機能するかを確認してください。

于 2012-10-09T23:09:56.673 に答える
1

jQueryを使用して、@ Gherkinの回答に基づいて構築します。

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 に答える
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

何処か別の場所:

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 は関数 ComboRemoval を 5 分で起動し、ボックスから ID 1234 を削除します。

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

于 2012-10-09T22:52:28.787 に答える
0

I solved this problem by usign session. The newest data was written in session, so the new requests were according to the data in session. I used php and js in concert. Js was reading trough php session

于 2013-04-13T16:21:36.697 に答える