Node.js如何定时读取另一文件中经websocket持续更新的变量
问题原因
你当前的写法拿不到最新值是因为:ES 模块导出基础类型值时是值拷贝,你在socket.js中导出的对象里的updatedVariable,是初始化时0的静态拷贝,后续你修改局部变量updatedVariable,不会同步更新到导出对象的属性上,所以 index.js 里每次读到的都是初始值。
解决方案1:使用 getter(无需修改 index.js 代码,改动最小)
修改socket.js的导出逻辑,给updatedVariable加一个 getter,每次读取时都会返回当前最新的局部变量值:
let updatedVariable = 0; const ws = new WebSocket('wss://stream.com.....'); ws.on('message', function incoming(data) { updatedVariable = data; }); export default { ws, // 加 getter,每次读取属性时动态返回最新值 get updatedVariable() { return updatedVariable; } }
改完后你原来的 index.js 代码不需要做任何调整,每秒打印的就是最新值。
解决方案2:用引用类型包裹变量
把要共享的变量放到对象/Map 这类引用类型里存储,导出引用类型后,修改内部属性会同步到所有引用的地方:socket.js 修改:
// 用对象包裹,属于引用类型 const sharedState = { updatedVariable: 0 }; const ws = new WebSocket('wss://stream.com.....'); ws.on('message', function incoming(data) { // 直接修改对象的属性 sharedState.updatedVariable = data; }); export default {ws, sharedState}
index.js 修改读取路径:
import socket from './socket.js'; setInterval(tick, 1000); const tick = () => { console.log(socket.sharedState.updatedVariable); }
内容的提问来源于stack exchange,提问作者Nico
相关产品推荐
相关产品推荐

