React - 回调的关闭问题

问题描述 投票:1回答:1

我一直有一些问题,我猜测是关闭,我只是猜测,因为它看起来像我不理解它,以及我认为。问题是这样的。

我想用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)

  1. 因为在创建函数时,函数闭包(我觉得上下文这个词更合适)会被初始化,所以函数以 counter 变量为0,这就是它总是打印0的原因。 这句话正确吗?

如果我把 stompClient.subscribe("/topic/some-route",(message) => myCallback(message)) 以外 useEffect 钩子 myCallback 函数将打印出当前状态,但是,考虑到这个 .subscribe(...) 函数对我的stomp broker创建了一个全新的订阅,我最终会有上百个订阅,每个状态更新一个,这显然不是一个解决方案。这让我想到了问题2。

  1. 考虑到我需要调用这个 .subscribe(message, callback) 函数只有一次,我怎样才能传入一个回调来反映我的状态?

谢谢你!

javascript reactjs closures react-hooks stomp
1个回答
0
投票

你有没有试过从回调中调用一个函数,然后记录该函数的状态?

const myCallBack = (message) => {
  onMessageReceived();
}

const onMessageReceived = () => {
  console.log(counter);
}

也许有?

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.