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

如何基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 17:24:56