Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/421.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
自时间戳以来经过的Javascript时间_Javascript_If Statement_Time - Fatal编程技术网

自时间戳以来经过的Javascript时间

自时间戳以来经过的Javascript时间,javascript,if-statement,time,Javascript,If Statement,Time,我试图通过将某些信息存储在变量中来“缓存”它。 如果2分钟过去了,我想获取“live”值(调用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((

我试图通过将某些信息存储在变量中来“缓存”它。
如果2分钟过去了,我想获取“live”值(调用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)
if((当前时间+2)
但这对我不起作用。 有人知道如何正确地检查自上次执行代码以来是否已经过了2分钟吗


TL;DR:想用if语句检查2分钟是否已经过去。

如果您愿意包含第三方LIB,这在其他任务中也可能非常方便:

不使用第三方LIB,只需使用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'

如果您想在JavaScript中的计时器上执行某些操作,应该使用或

让代码在连续循环中运行会导致错误

使用
setTimeout
相当简单:

setTimeout(function(){
    // do everything you want to do
}, 1000*60*2);
这将导致函数在中运行(有关更多细节,请参阅John Resig的这篇博客文章)。第二个参数是毫秒数,所以我们乘以60得到分钟,然后乘以2得到2分钟


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

您可以执行类似操作

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;
}
var myVal={
数据:空,
时间:新日期()
}
函数getMyVal(){
如果(myVal.time
将算法转换为可工作的javascript,您可以执行以下操作:

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'
var lastTime=0;
如果(数学下限((新日期()-上次)/60000)<2){
//从变量获取
}否则{
//从url获取
lastTime=新日期();
}
您可以将
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();
    }
}
var lastTime=0;
函数getInfo(){
如果(数学下限((新日期()-上次)/60000)<2){
//从变量获取
}否则{
//从url获取
lastTime=新日期();
}
}

希望有帮助。

最好不要,网站必须尽可能轻量级,否则我会使用PHP实现这个特定功能。我不希望我的代码每两分钟做一次。如果2分钟过去了,我希望我的代码执行一个特定的代码,否则它将执行其他操作。为了澄清,它将仅在用户刷新页面后执行IF语句。然后,代码将检查自上次调用以来是否已过2分钟。@Parrotmaster如何检查是否已过2分钟?这是对用户提供一些输入的反应吗?比如,如果他们点击这个框,两分钟过去了,执行x,否则执行y?确切地说,如果两分钟过去了,我希望代码从URL获取内容,否则从变量获取内容。@Parrotmaster-ah。这个问题有比这个更好的答案。我尝试了第一个选项,但在第一次调用IF之后,它总是给出IF的结果,而不是ELSE的结果。我正在运行的代码已经在生成整个页面的函数中。我不确定你的意思。我的代码如下:每次调用oneIn2Min()都会打印“已执行”,除非oneIn2Min()在不到2秒前被调用。这是预期的行为吗?我不会将其放入函数中,因为这样我就必须在函数生成后立即调用它,所以我最好立即执行它。关键是声明函数一次,然后多次调用它。好的,在这种情况下,我将继续查找。无论如何谢谢。谢谢,但是这总是在2分钟后调用IF而不是ELSE。对不起,我的错。
lastTime
变量最初应为
0
。答案经过编辑。它几乎完全符合我的要求。它第一次调用“实时”URL,之后只调用缓存。但是,在2分钟后(或出于测试目的,1分钟后),它不会调用url。另外,在ELSE中是它第一次调用live的地方,在IF中是它调用变量的地方,与您的示例正好相反(但是切换代码修复了它)。请不要介意我前面的注释。它起作用了!非常感谢这正是我想要的:我想你可能从错误的角度来看待这件事。您可以声明一个变量,该变量的值每2分钟更新一次。然后,无论何时访问它,它都将返回现有值,或者如果超过了n+2分钟阈值,它将返回新值。