You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js中按键启停定时器函数遇addEventListener报错求助

问题根源

你这段代码是浏览器环境的写法,但Node.js是服务端运行环境,既没有window对象,也不存在浏览器的DOM事件机制——所以直接调用window.addEventListener会报window未定义;换成global也没用,因为global对象根本没有addEventListener方法,自然会触发this is not a function错误。

解决方案1:用Node.js内置readline模块(无额外依赖)

readline是Node.js内置模块,可直接监听终端输入事件,完美适配你的按键启停需求:

const readline = require('readline');
let refreshIntervalId;

// 初始化readline,绑定终端输入输出
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
  terminal: true
});

// 监听按键按下事件
rl.input.on('keydown', (e) => {
  switch (e.keyCode) {
    case 115: // F4键
      start();
      break;
    case 83: // 小写s键
      stop();
      break;
  }
});

function start() {
  stop();
  refreshIntervalId = setInterval(async () => {
    // 替换成你自己的Data异步函数
    const result = await Data();
    console.log(result);
  }, 5000);
  console.log('定时器已启动');
}

function stop() {
  if (refreshIntervalId) {
    clearInterval(refreshIntervalId);
    refreshIntervalId = null;
    console.log('定时器已停止');
  }
}

// 示例异步函数,替换为你的实际逻辑
async function Data() {
  return new Promise(resolve => {
    setTimeout(() => resolve('获取到的数据'), 100);
  });
}

// 程序退出时清理资源
process.on('SIGINT', () => {
  rl.close();
  stop();
  process.exit();
});

解决方案2:用第三方keypress模块(更友好的按键识别)

如果需要监听组合键、特殊按键(如方向键),可以用keypress模块,先安装依赖:

npm install keypress

然后编写代码:

const keypress = require('keypress');
let refreshIntervalId;

// 启用按键监听
keypress(process.stdin);

// 监听按键事件
process.stdin.on('keypress', (ch, key) => {
  if (!key) return;
  
  // 按F4启动,按s停止
  if (key.name === 'f4') {
    start();
  } else if (key.name === 's') {
    stop();
  }
  
  // 按Ctrl+C退出程序
  if (key.ctrl && key.name === 'c') {
    stop();
    process.exit();
  }
});

// 设置终端为原始模式,捕获所有按键输入
process.stdin.setRawMode(true);
process.stdin.resume();

function start() {
  stop();
  refreshIntervalId = setInterval(async () => {
    const result = await Data();
    console.log(result);
  }, 5000);
  console.log('定时器已启动');
}

function stop() {
  if (refreshIntervalId) {
    clearInterval(refreshIntervalId);
    refreshIntervalId = null;
    console.log('定时器已停止');
  }
}

// 示例异步函数,替换为你的实际逻辑
async function Data() {
  return new Promise(resolve => {
    setTimeout(() => resolve('获取到的数据'), 100);
  });
}

注意事项

  • Node.js终端的按键监听依赖stdin的原始模式,程序退出时记得通过SIGINT事件清理资源,避免异常退出。
  • 你的Data是异步函数,用async/await替代.then写法,代码可读性更高。

内容的提问来源于stack exchange,提问作者JustForFun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 23:31:18