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 中的计时器上做一些事情,你应该使用setTimeoutor setInterval

让你的代码连续循环运行会导致你的浏览器的虚拟机崩溃

使用setTimeout相当简单:

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

这将导致函数在设置超时后至少两分钟内运行(有关更多详细信息,请参阅 John Resig 的这篇博文)。第二个参数是毫秒数,所以我们乘以 60 得到分钟,然后乘以 2 得到 2 分钟。

setInterval, 遵循相同的语法将每 x 毫秒执行一些操作。

于 2013-03-07T13:49:36.087 回答
1

不使用 3rd 方库,只需使用 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

如果您愿意包含第 3 方库,这在其他任务中也可能非常方便: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 回答