我试图通过将其存储在变量中来“缓存”某些信息 如果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分钟。
答案 0 :(得分:6)
将您的算法转换为正常运行的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();
}
}
希望它有所帮助。
答案 1 :(得分:3)
如果您想在JavaScript中使用计时器执行某些操作,则应使用setTimeout
或setInterval
。
让代码以连续循环方式运行会导致browser's VM to crash。
使用setTimeout
非常简单:
setTimeout(function(){
// do everything you want to do
}, 1000*60*2);
这将导致该函数在at least two minutes from the time the timeout is set中运行(有关更多详细信息,请参阅John Resig的此博客文章)。第二个参数是毫秒数,因此我们乘以60得到分钟,然后乘以2得到2分钟。
setInterval
,遵循相同的语法,每隔几毫秒就会做一些事情。
答案 2 :(得分: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'
答案 3 :(得分:0)
如果您打开包含第三方库,这在其他任务中也可能非常方便: http://momentjs.com/docs/#/manipulating/add/
答案 4 :(得分: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;
}