我一直有一些问题,我猜测是关闭,我只是猜测,因为它看起来像我不理解它,以及我认为。问题是这样的。
我想用Stomp建立一个web套接字连接。它的工作方式是,你创建一个stomp客户机。
let stompClient = Stomp.over(socket);
然后你订阅一些路由,通过路由和回调,当该路由被击中时,回调被调用。
stompClient.subscribe("/topic/some-route",(message) => myCallback(message))
由于创建一个客户端似乎是一次性的事情,我决定把它放在一个新的客户端中。useEffect
钩子,在数组中没有任何依赖关系,这样客户端只有在组件挂载时才会被创建。
useEffect(() => {
//some unimportant setup
let stompClient = Stomp.over(socket);
stompClient.subscribe("/topic/some-route",(message) => myCallback(message))
}, [])
我还在我的组件中保留了一些状态,为了简单起见,比如说我保留了这个。
const [counter, setCounter] = useState(0);
我想让我的回调做的事情,只是打印出状态,所以,我的回调是:
const myCallback = (message /* the message variable is unimportant here */ ) => {
console.log(counter);
}
现在,当用户在使用应用程序的时候,就会发现 counter
但每当回调被触发时,它总是打印0。利用我所掌握的闭包知识,我猜测.....: (这是问题1)
counter
变量为0,这就是它总是打印0的原因。 这句话正确吗?如果我把 stompClient.subscribe("/topic/some-route",(message) => myCallback(message))
以外 useEffect
钩子 myCallback
函数将打印出当前状态,但是,考虑到这个 .subscribe(...)
函数对我的stomp broker创建了一个全新的订阅,我最终会有上百个订阅,每个状态更新一个,这显然不是一个解决方案。这让我想到了问题2。
.subscribe(message, callback)
函数只有一次,我怎样才能传入一个回调来反映我的状态? 谢谢你!
你有没有试过从回调中调用一个函数,然后记录该函数的状态?
const myCallBack = (message) => {
onMessageReceived();
}
const onMessageReceived = () => {
console.log(counter);
}
也许有?