当一个变量在不同的getintervals中纠缠时,我该如何更改它

how do i change a variable value when it gets tangled in various getintervals?

本文关键字:纠缠 何更改 getintervals 一个 变量      更新时间:2023-09-26

我有一个用于定格动画的jquery小脚本。它使用moment.js来获取时间,然后进行一些数学运算来获得一个"帧"编号,然后进行填充以将其与我目录中的文件名匹配,将其插入img src中,然后迭代+1。我有两个setInterval函数,一个控制帧速率(getframe),另一个控制客户端检查正确时间的频率(gettime)。

不过,我刚刚发现我的目录中有很多死框——我想跳过的图像文件,但我不能在不打乱整个序列的情况下直接删除,确切地说,我希望我的脚本从image-029399.jpg跳过到image-031170.jpg。因为客户端可能会在死框中间登录,我想我应该有一些语句,比如if(frame>=29399&<=31170;{frame=31171};),但我不太明白如何在不让一切停止工作的情况下将其插入到我的代码中。。。下面是我的代码:

window.onload = $(function () {
    gettime();
    setinterval(gettime,10000);   
    setInterval(getframe,580); 
    var frame;
    function gettime() {
        now = moment().zone('+0045');
        if (now.hour()<=17) {
            now =now.subtract('day',1)
        }
        if (now.hour() >= 18) {
            now = now.subtract('hour', 18).subtract('minute', 30);
        } 
        else {
            now = now.add('hour', 6).subtract('minute', 30);
        }  
        frame = ((now.hour() * 3600) + (now.minute() * 60) + now.second()) * 2 +7463;
    } 

    function getframe() { 
        var framestr = frame? frame.toString() : "";
        function pad (str, max) {
            return str.length < max ? pad("0" + str, max) : str;
        }
        framerun = pad (framestr,6);
        var src = "https://s3.amazonaws.com/combined11/image-"+ framerun +".jpg";
        framerun1=parseInt(framerun);
        $("#frame_placeholder").attr("src", src);
        frame=framerun1 += 1;
    }
});

在设置帧的位置更改它,即gettime。将此添加到您的frame =下面。。。行:

function gettime() {
    now = moment().zone('+0045');
    if (now.hour()<=17) {
        now =now.subtract('day',1)
    }
    if (now.hour() >= 18) {
        now = now.subtract('hour', 18).subtract('minute', 30);
    } 
    else {
        now = now.add('hour', 6).subtract('minute', 30);
    }  
    frame = ((now.hour() * 3600) + (now.minute() * 60) + now.second()) * 2 +7463;
    if (frame >= 29399) {
       frame += 1771;
    }
}

现在,为什么?

首先,你在设置框架的地方更改它,因为这是settor的问题,而不是gettor的问题。当然,由于每次都要重新计算,请确保在重新计算后放入新代码。

起初,我考虑了您所做的:if (frame >= 29399 && frame <= 31170) frame = 31171;,但这基本上使程序在1771帧中挂在同一帧上。

然后我考虑了if (frame >= 29399 && frame <= 31170) frame += 1771,但更糟糕的是,它会跳到正确的帧,前进1771帧,然后跳回31171帧,这是不希望的。

不,您只想跳过一个间隙,该间隙之后的所有帧都必须进行相同的跳跃。因此,一旦到达间隙的低端,只需将间隙的距离(31170-29399)与所有值相加即可。

编辑实际上,我对您系统的其他部分了解不够,不知道这是否是正确的答案。如果其他事情取决于frame的值,那么实际上您可能希望在不更改帧的基本值的情况下对gettor进行更改:

function getframe() { 
    var framestr = frame ? (frame >= 29399) ? (frame + 1771).toString() : frame.toString() : "";

根据您在死区中想要的行为,您可能需要使用我讨论过的任何其他函数变体。var framestr=帧?frame.toString():";

看起来getFrame的顶部最有意义,不是吗?

function getframe() {
    if (frame && ((frame >= 29399) && (frame <= 31170))) {
        frame = 31171;
    }
    var framestr = frame ? frame.toString() : "";
    // etc.