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
相关产品推荐
相关产品推荐

