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

Socket触发超时检查:如何判断timer是否已启动

检查Socket超时定时器是否已启动的方法

手动封装状态追踪(推荐)

自己维护一个状态变量,触发超时emit时标记状态,回调触发后重置,完全可控:

let isTimeoutRunning = false;
const timeoutDuration = 5000; // 5秒超时

// 触发带超时的emit
isTimeoutRunning = true;
socket.timeout(timeoutDuration).emit('foo', (error, response) => {
  isTimeoutRunning = false; // 无论超时还是收到响应,都重置状态
  if (error) {
    console.log('请求超时了');
  } else {
    console.log('收到响应:', response);
  }
});

// 检查定时器状态的函数
function checkTimeoutStatus() {
  console.log('当前是否有超时定时器在运行:', isTimeoutRunning);
  return isTimeoutRunning;
}

利用Socket.IO内部私有属性(不建议生产用)

Socket.IO的timeout方法会把待处理的超时任务存在内部私有属性里(比如4.x版本的socket._timeouts),可以通过这个判断,但私有属性可能随版本变更:

function hasActiveTimeout() {
  return socket._timeouts && socket._timeouts.size > 0;
}

扩展Socket实例复用功能

如果需要多处使用这个特性,可以扩展Socket原型,封装带状态追踪的emit方法:

import { Socket } from 'socket.io';

// 扩展Socket原型,添加带超时状态追踪的emit方法
Socket.prototype.emitWithTimeout = function(event, timer, callback) {
  this._timeoutActive = true;
  return this.timeout(timer).emit(event, (error, response) => {
    this._timeoutActive = false;
    callback(error, response);
  });
};

// 添加检查状态的方法
Socket.prototype.isTimeoutActive = function() {
  return !!this._timeoutActive;
};

// 使用示例
socket.emitWithTimeout('foo', 5000, (error, response) => {
  // 处理回调逻辑
});

// 检查状态
console.log(socket.isTimeoutActive());

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 05:52:09