node.js clearTimeout() 不工作

node.js clearTimeout() not working

我尝试构建一个警报功能,如果我的车库门仍然打开,它会在 5 分钟后触发。问题是无论在 "offen" 之后出现什么消息,cleartimeout 都不起作用,因此在每个 "offen"status 之后都会执行警报。如果有人能给我提示就太好了...

    function handleGarageState(message) {
      Status = message.toString();
      garageState = message
      io.emit('Garagenstatus', {
        data: String(garageState)
      });
      var Eintrag = {
        Datum: moment().format('YYYY-MM-DD HH:mm:ss'),
        Status: Status
      };
      writeStatus(Eintrag);
      if (Status == 'offen') {
       var alert = setTimeout(function () {
          console.log("ALERT "); //here will be the alert function
        }, 60000 * 5)
      } else {
        clearTimeout(alert);
      }
    }

我没看到你在哪里定义警报,所以你可能多次犯错并且你没有清除旧的超时并且你覆盖了警报值并且只清除了最后一次超时。

function handleGarageState(message) {
    Status = message.toString();
    garageState = message;
    io.emit('Garagenstatus', {
        data: String(garageState)
    });
    var Eintrag = {
        Datum: moment().format('YYYY-MM-DD HH:mm:ss'),
        Status: Status
    };
    writeStatus(Eintrag);
    if (Status == 'offen') {
        //v-- Here
        var alert = setTimeout(function () {
            console.log("ALERT "); //here will be the alert function
        }, 60000 * 5)
    } else {
        clearTimeout(alert);
    }
}

您在每次调用该函数时都会创建一个新变量 alert。问题是,旧的 alert 仍在某处等待。 您需要将 alert 集中在函数范围之外 并且 在设置新的超时之前清除它。

var alert;

function handleGarageState(message) {
    Status = message.toString();
    garageState = message;
    io.emit('Garagenstatus', {
        data: String(garageState)
    });
    var Eintrag = {
        Datum: moment().format('YYYY-MM-DD HH:mm:ss'),
        Status: Status
    };
    writeStatus(Eintrag);
    if (Status == 'offen') {
        clearTimeout(alert);
        alert = setTimeout(function () {
            console.log("ALERT "); //here will be the alert function
        }, 60000 * 5)
    } else {
        clearTimeout(alert);
    }
}

对于“反应”:“^17.0.2”,“反应-dom”:“^17.0.2”,

需要注意的是:这是一个函数。

我遇到了同样的问题,目前只能通过state

解决

我在导航栏中使用 setTimeoutclearTimeout,这是我的完整代码,

import React, { useState } from 'react';
import { Link, NavLink, useNavigate } from 'react-router-dom';

const Navbar = (props) => {

    // https://reactrouter.com/docs/en/v6/getting-started/concepts#navigate-function
    let navigate = useNavigate();
    const [state, setPosts] = useState({ alert: null });

    const setRainbow = (e) => {
        if (e.target.text === 'About') {
            clearTimeout(state.alert)
            var a = setTimeout(() => {
                navigate("/contact");
            }, 2000);
            setPosts(s => ({ ...s, alert: a }));
        } else {
            clearTimeout(state.alert)
            setPosts(s => ({ ...s, alert: null }));
        }
    }

    return (
        <nav className="nav-wrapper red darken-3">
            <div className="container">
                <Link to="/" className="brand-logo">Poke'Times</Link>
                <ul className="right" onClick={setRainbow}>
                    <li><Link to="/">Home</Link></li>
                    <li><NavLink to="/about">About</NavLink></li>
                    <li><NavLink to="/contact">Contact</NavLink></li>
                </ul>
            </div>
        </nav>
    );
}

export default Navbar;

这包括 useState、Link、NavLink、useNavigate