对计时器中的数据执行某些操作

Do something with data from timer

本文关键字:操作 执行 数据 计时器      更新时间:2023-09-26

我有一个问题。我想做的是:我有一个间隔函数正在运行。每 5 秒能量下降 1。我想在 var 能量为 66 或更低时做一次。(同样当能量小于 50 时,但那是以后的事)。但它不会显示 if 状态,只会显示其他状态。有人可以帮我吗?

var energy = 70;
setInterval    (function () {
    energy = energy - 1;
    $("#energiegetal").val(energy);
    }, 5000);
if (energy < 67){
    console.log("works")    
}
else    {
    console.log("not working")
}

您的function需要包含您的if语句,如下所示:

var energy = 70;
setInterval (function () {
    energy = energy - 1;
    $("#energiegetal").val(energy);
    if (energy < 67){
        console.log("works")    
    }
    else {
        console.log("not working")
    }
}, 5000);

@sherb的答案可能是你所需要的。 但是,如果您的代码更复杂,您可能希望将其分解为彼此不知道的不同部分。 一种方法是通过某种信号系统连接部件,例如匿名PubSub/EventEmitter机制。 那里有很多。 使用全局events模块,这可能会将代码转换为如下所示的内容:

(function() {
    var energy = 70; // local to this IIFE
    setInterval(function() {
        energy = energy -1;
        events.emit('energyChanged', energy);
    }, 5000);
}());
events.on('energyChanged', function(energy) {
    if (energy < 67){
        console.log("works")    
    } else {
        console.log("not working")
    }
});

正如我所说,这对您的情况来说可能是矫枉过正的,但是当您的要求需要时,这是一件好事。

这是一种适合

初学者的方法:

var energy = 70;
var period = 5000; //ms
var test67 = function() {
    energy = energy - 1;
    $("#energiegetal").val(energy);
    if (energy < 67) {
        console.log("67 works");
        setTimeout(test50, period);
    } else {
        setTimeout(test67, period);
    }
};
var test50 = function() {
    energy = energy - 1;
    $("#energiegetal").val(energy);
    if (energy < 50) {
        console.log("50 works");
        setTimeout(keepDropping, period);
    } else {
        setTimeout(test50, period);
    }
};
var keepDropping = function() {
    energy = energy - 1;
    $("#energiegetal").val(energy);
    setTimeout(keepDropping, period);
};
setTimeout(test67, period);

你可以在JSBin上看到它的实际效果。 有很多不喜欢的地方,主要与重复有关,但它应该是相当可以理解的。

我不知道你是否希望在第二次脱粒后能量继续下降。 如果没有,则可以删除该函数以及引用该函数的setTimeout调用。

请注意setTimeoutsetInterval之间的区别。 使用 setTimeout ,我们手动触发每个下一个调用。 随着 setInterval ,它们不断发生,但更难知道何时取消或更改使用的功能。

另一种方法是为每个脱粒

使用标志,报告它们是否已运行,并每次检查标志以查看该脱粒是否已被触发。

还有许多其他选择,几乎所有方法的代码都比这短。 但这和我能想象的一样明确。