1

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

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

3 回答 3

3
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在每次调用该函数时创建一个新的 var。问题是,老人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);
    }
}
于 2016-08-31T13:31:26.367 回答
0

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

于 2016-08-31T13:20:17.243 回答
0

对于“react”:“^17.0.2”,“react-dom”:“^17.0.2”,

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

我遇到了同样的问题,按照现在,我只能通过使用状态来解决

我在导航栏中使用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

于 2021-12-07T18:38:05.923 回答