【问题标题】:Javascript time passed since timestamp自时间戳以来经过的 Javascript 时间
【发布时间】:2013-03-07 13:43:22
【问题描述】:

我正在尝试通过将某些信息存储在变量中来“缓存”它。
如果 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 分钟是否过去。

【问题讨论】:

  • 我认为您可能从错误的角度来处理这个问题。您可以声明一个变量,它的值可以每 2 分钟更新一次。那么无论何时访问它都没有关系,它要么返回现有值,要么如果超过 n+2 分钟阈值,则返回新值。

标签: javascript if-statement time


【解决方案1】:

将您的算法转换为有效的 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();
    }
}

希望对你有帮助。

【讨论】:

  • 谢谢,但这总是在 2 分钟后调用 IF 而不是 ELSE。
  • 对不起,我的错。 lastTime 变量最初应为 0。答案已编辑。
  • 它几乎完全符合我的要求。它第一次调用“实时”URL,之后只调用缓存。然而,在 2 分钟后(或 1 分钟用于测试目的)它不会调用 url。同样在 ELSE 中是它第一次调用 live 的地方,而在 IF 中是它调用变量的地方,与您的示例完全相反(但切换代码修复了它)。
  • 别介意我之前的评论。有用!非常感谢,这正是我想要的:D
【解决方案2】:

如果你想在 JavaScript 中对定时器做一些事情,你应该使用 setTimeoutsetInterval

让您的代码在连续循环中运行将导致您的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,遵循相同的语法将每 x 毫秒执行一次。

【讨论】:

  • 我不希望我的代码每 2 分钟执行一次操作。如果 2 分钟过去了,我希望我的代码执行特定代码,否则它会执行其他操作。澄清一下,它只会在用户刷新页面后执行 IF 语句。然后代码将检查自上次调用以来是否已过去 2 分钟。
  • @Parrotmaster 你打算如何检查是否已经过了 2 分钟?这是对用户提供一些输入的反应吗?就像如果他们点击这个框并且两分钟过去了,做 x,否则做 y?
  • 没错,我希望代码在 2 分钟后从 URL 获取内容,否则从变量获取内容。
  • @Parrotmaster 啊。这个问题有比这个更好的答案。
【解决方案3】:

不使用 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'

【讨论】:

  • 我尝试了第一个选项,但在第一次调用 IF 后,它总是给我 IF 而不是 ELSE 的结果。我正在运行的代码已经在生成整个页面的函数中。
  • 我不确定你的意思。我的代码工作如下:每次调用 oneIn2Min() 都会打印“已执行”,除非 oneIn2Min() 在 2 秒前被调用。这是预期的行为吗?
  • 我没有把它放到一个函数中,因为那样我必须在它完成后立即调用该函数,所以我还不如立即执行它。
  • 重点是函数声明一次,然后多次调用。
  • 好的,那样的话我会继续寻找。无论如何,谢谢。
【解决方案4】:

如果您愿意包含 3rd 方库,这在其他任务中也可能非常方便: http://momentjs.com/docs/#/manipulating/add/

【讨论】:

  • 最好不要,网站必须尽可能轻量级,否则我会使用 PHP 来实现这个特定功能。
【解决方案5】:

你可以这样做

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多