0

这是我在使用 react-stomp 库订阅多个主题时遇到的奇怪行为。

这些是通过的主题:

0: "/topic/settings/update"
1: "/queue/9999999999/notifications"
<SockJsClient
        url={apiUrl}
        topics={this.props.topics}
        onMessage={this.onMessage}
        ref={(client) => { this.clientRef = client; }}
        debug
 />

(注意我没有先通过 subscribeHeaders)

我保留了一些断点来调试react-stomp/dist/client.jsstompjs/lib/stomp.js查看分配给这些订阅的 id。

图片 这(上图)是第react-stomp/dist/client.js一个主题的第一次调用。我们可以看到 this.props 中的 subscribeHeaders 只是一个空白对象。

图片 这(上图)是 subscribe 函数的第一次调用,stompjs/lib/stomp.js我们得到空白对象作为 headers 参数。

图片 这(上图)是第二react-stomp/dist/client.js个主题的第二次调用(请注意,这次我们从无处获得 subscribeHeaders

图片 这(上图)是第二个主题的 subscribe fn 的第二次调用stompjs/lib/stomp.js:(现在,我们在参数中有标题,因此我们的第二个“if”条件将是错误的,因此也为第二个主题提供相同的 id

这整个奇怪的问题可以通过传递“subscribeHeaders={null}”来解决,然后每个主题开始获取不同的 id(即“sub-0”、“sub-1”)

<SockJsClient
        url={apiUrl}
        subscribeHeader={null} //only works when passed "null". Doesn't work if passed blank object "{}"
        topics={this.props.topics}
        onMessage={this.onMessage}
        ref={(client) => { this.clientRef = client; }}
        debug
 />
4

1 回答 1

0

看起来问题是因为实际subscribeHeaders对象正在被 stomp.js 修改。

Javascript 将 Object 作为引用的副本传递给函数。这意味着如果对象在函数内部发生变化,那么实际对象也会发生变化。

由于上述 Javascript 行为,对 subscribe 的第一次调用是添加更改对象的id对象,然后将该对象传递给后续的 subscribe 调用。sub-0subscribeHeaders

于 2021-01-16T19:14:06.520 回答