7

情報を変数に格納して「キャッシュ」しようとしています。
2分が経過した場合、「ライブ」値を取得したいと思います(URLを呼び出します)。2分が経過していない場合は、変数からデータを取得します。

私が基本的に欲しいのは:

if(time passed is less than 2 minutes) {
    get from variable
} else {
    get from url
    set the time (for checking if 2 minutes have passed)
}

私は次のようなもので時間を計算してみました

if((currentime + 2) < futuretime)

しかし、それは私にはうまくいきませんでした。コードを最後に実行してから2分が経過したかどうかを適切に確認する方法を知っている人はいますか?

TL; DR:IFステートメントで2分が経過したかどうかを確認したい。

4

5 に答える 5

12

アルゴリズムを有効な JavaScript に変えると、次のようなことができます。

var lastTime = 0;

if ( Math.floor((new Date() - lastTime)/60000) < 2 ) {
    // get from variable
} else {
    // get from url
    lastTime =  new Date();
}

ブロックを関数に入れif、変数または URL から情報を取得したいときにいつでも呼び出すことができます。

var lastTime = 0;

function getInfo() {
    if ( Math.floor((new Date() - lastTime)/60000) < 2 ) {
            // get from variable
    } else {
        // get from url
        lastTime =  new Date();
    }
}

それが役に立てば幸い。

于 2013-03-07T14:20:41.607 に答える
3

JavaScriptのタイマーで何かをしたい場合は、setTimeoutまたはを使用する必要がありますsetInterval

コードを連続ループで実行すると、ブラウザのVMがクラッシュします。

使用setTimeoutはかなり簡単です:

setTimeout(function(){
    // do everything you want to do
}, 1000*60*2);

これにより、タイムアウトが設定されてから少なくとも2分で関数が実行されます(詳細については、John Resigのこのブログ投稿を参照してください)。2番目の引数はミリ秒数であるため、60を掛けて分を取得し、次に2を掛けて2分を取得します。

setInterval、同じ構文に従うと、xミリ秒ごとに何かが実行されます。

于 2013-03-07T13:49:36.087 に答える
1

サードパーティのライブラリを使用せずに、Date.getTime()を使用して、変数として保存します。

var lastRun = null;

function oneIn2Min() {
    if (lastRun == null || new Date().getTime() - lastRun > 2000) {
        console.log('executed');
    }
    lastRun = new Date().getTime();
}

oneIn2Min();  // prints 'executed'
oneIn2Min();  // does nothing
oneIn2Min();  // does nothing
setTimeout(oneIn2Min, 2500);  // prints 'executed'

また、それからいくつかの単純なオブジェクトを作成することを選択することもできます(コードを整理するため)。次のようになります。

var CachedCall = function (minTime, cbk) {
    this.cbk = cbk;
    this.minTime = minTime;
};

CachedCall.prototype = {
    lastRun: null,

    invoke: function () {
        if (this.lastRun == null || new Date().getTime() - this.lastRun > this.minTime) {
            this.cbk();
        }
        this.lastRun = new Date().getTime();
    }
};

// CachedCall which will invoke function if last invocation
// was at least 2000 msec ago 
var c = new CachedCall(2000, function () {
    console.log('executed');
});

c.invoke(); // prints 'executed'
c.invoke(); // prints nothing
c.invoke(); // prints nothing 
setTimeout(function () {c.invoke();}, 2300); // prints 'executed'
于 2013-03-07T13:49:20.253 に答える
0

サードパーティのライブラリを含めることができる場合、これは他のタスクでも非常に便利な場合があります:http: //momentjs.com/docs/#/manipulating/add/

于 2013-03-07T13:48:01.053 に答える
0

あなたはそのようなことをすることができます

var myVal = {
  data: null,
  time: new Date()
}

function getMyVal () {
  if(myVal.time < new Date(new Date().getTime() - minutes*1000*60)) {
    myVal.data = valFromRequest;
    myVal=time=new Date();
  }
  return myVal.data;
}
于 2013-03-07T13:51:09.227 に答える