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

WebSocket模块API选型:静态方法 vs 实例方法哪个更优?

关于WebSocket管理模块的API设计选择

我需要开发一个模块,用于处理一个或多个URL硬编码的WebSocket连接与订阅。模块需提供与这些WebSocket及关联REST API交互的各类方法,核心要求是:仅在有请求时建立连接,无需求时自动关闭。应用的任意部分都可导入该模块并操作WebSocket/端点,但模块绝对不能暴露WebSocket实例。

当前我只关注模块的API设计(不涉及内部实现),考虑了两种接口方案:

  • 方案一:通过静态方法(单独导出的函数)提供操作
  • 方案二:通过实例化类提供方法

我认为创建引用静态WebSocket的类方法毫无意义,只会增加不必要的复杂度,本质就是静态方法的代理。实例化方案唯一的优势是能保证操作WebSocket前连接已建立(见下方代码示例)。

我已经完成了两种实现且均可正常运行,但仍不确定哪种方案更优,想听听大家的经验与看法。


静态方法方案示例

// 导入所有函数
import * as SpecificWebSocketManager from 'specific-websocket-manager.js';

// 订阅私有WebSocket需要认证token
const token = await SpecificWebSocketManager.getWebSocketToken({ apikey: 'string', secret: 'string' });

// 任何私有订阅都需要该token及其他信息
// 同一WebSocket可使用不同的api密钥
const subscription = {
    token: 'string',  
    apikey: 'string', 
    name: 'subscriptionName', 
    callback: subscriptionCallback,
};

// 若连接未建立,管理器将建立WebSocket连接。这是异步调用
// 不保证订阅一定成功,连接可能失败
SpecificWebSocketManager.subscribe(subscription).catch();

// 当无剩余订阅时,管理器将关闭WebSocket
SpecificWebSocketManager.unsubscribe(subscription); 

实例化方案示例

// 导入默认导出
import SpecificWebSocketManager from 'specific-websocket-manager.js';

// 若连接未建立,管理器将建立WebSocket连接。这是异步调用
// 若token不存在,将在内部获取
// 若实例创建成功,则保证连接已建立
// 注意:仍需通过静态调用(工厂方法)创建实例
const privateInstance = await SpecificWebSocketManager.privateInstance({ apikey: 'string', secret: 'string' }).catch(); 

// Apikey已提供,token已获取
const subscription = { 
    name: 'subscriptionName',
    callback: subscriptionCallback 
};

// 连接已建立,此处无需异步调用
privateInstance.subscribe(subscription);

// 即使无剩余订阅,管理器仍保持连接,因为后续可能再次订阅
privateInstance.unsubscribe(subscription);

// 仅当所有实例都关闭时,管理器才会关闭WebSocket
// 调用此方法后无法再订阅
privateInstance.close();

// 调用此方法可重新订阅
privateInstance.connect().catch();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 17:48:20