如何基于Node.js的steamuser模块实现Steam断连时的代码阻塞与恢复
解决Steam连接断开时暂停代码执行的方案
Node.js是异步事件驱动的,不能直接用同步阻塞的方式暂停代码(会卡死整个事件循环),但可以通过Promise+异步等待的方式,让所有依赖Steam连接的操作自动等待连接恢复后再执行。结合steamuser的事件监听,具体实现如下:
核心思路
维护一个"连接就绪"的Promise:
- 初始状态下,连接成功后这个Promise处于resolved状态
- 当
disconnected事件触发时,重置这个Promise为pending状态 - 当
loggedOn事件触发时,resolve这个Promise,让所有等待的操作继续执行
所有需要调用Steam接口的代码,都先await这个Promise,确保连接正常后再执行。
具体代码实现
const SteamUser = require('steamuser'); const client = new SteamUser(); // 维护连接状态的Promise和resolve控制器 let connectionReadyPromise = Promise.resolve(); let resolveConnectionReady; // 监听断开事件:重置连接Promise为pending状态 client.on('disconnected', () => { console.log('Steam连接断开,等待重连...'); // 创建新的pending Promise,保存resolve函数 connectionReadyPromise = new Promise(resolve => { resolveConnectionReady = resolve; }); }); // 监听登录成功事件:resolve连接Promise client.on('loggedOn', () => { console.log('Steam连接已重建'); if (resolveConnectionReady) { resolveConnectionReady(); resolveConnectionReady = null; // 清空控制器,避免重复调用 } }); // 封装等待连接就绪的工具函数 async function waitForConnection() { await connectionReadyPromise; } // 示例:需要依赖Steam连接的操作 async function doSteamOperation() { try { // 先等待连接就绪 await waitForConnection(); // 执行你的Steam操作,比如发送消息、查询库存等 console.log('执行Steam操作...'); // client.someSteamFunction(...); } catch (err) { console.error('Steam操作失败:', err); } } // 初始化登录(根据你的配置填写) client.logOn({ accountName: '你的账号', password: '你的密码' });
关键细节说明
- 这种方式不会阻塞整个Node.js事件循环,只是让依赖连接的异步操作暂停等待,其他非依赖的代码可以正常运行
- 如果你的程序是循环执行Steam操作(比如定时任务),每次循环前都要调用
await waitForConnection() - 可以根据需求扩展:比如给
waitForConnection添加超时逻辑,避免无限等待
内容的提问来源于stack exchange,提问作者Limes
相关产品推荐
相关产品推荐

