Hea*_*ren 2 javascript websocket sockjs
我只在页面加载时尝试连接到远程一次,然后在必要时订阅频道。
为了保证代码可以被不同页面共享,我编写了如下代码(闭包),并将函数导出webSocket为:
export function webSocket() {
const socket = new SockJS(WebSocketEndPoint.RESOURCE_CONTROLLER);
const stompClient = Stomp.over(socket);
let isConnected = false;
function subscribe(address, callback) {
if (isConnected) {
stompClient.subscribe(address, callback);
} else {
stompClient.connect({}, () => {
isConnected = true;
stompClient.subscribe(address, callback);
});
}
};
function subscribeRealtimeExecOutput(addr, callback){
subscribe(addr, callback);
}
return {
subscribeRealtimeExecOutput,
};
}
Run Code Online (Sandbox Code Playgroud)
和
在其他页面中使用如下:
import { webSocket } from '../../websocket/websocketService';
//in the constructor
this.subscriber = webSocket().subscribeRealtimeExecOutput;
//used when required
this.subscriber(pane.jobIdentifier, (data) => {
console.log(data);
});
Run Code Online (Sandbox Code Playgroud)
我希望该connect方法仅在同一页面内运行一次,然后订阅者将根据连接订阅不同的频道。
但是,它似乎不起作用 - 连接将不会建立,因此浏览器只会提示我打开 Web 套接字...
有人可以帮忙吗?非常感谢你的帮助。
此致, 赫伦
我自己在本地测试后发现,创建客户端并直接连接到服务器后,一切都非常顺利。所以我重构了我的订阅代码如下:
function subscribe(address, callback) {
if (isConnected) {
stompClient.subscribe(address, callback);
} else {
stompClient = Stomp.over(socket);
isConnected = true;
stompClient.connect({}, () => {
stompClient.subscribe(address, callback);
}, () => {
console.error('Sorry, I cannot connect to the server right now.');
});
}
}
Run Code Online (Sandbox Code Playgroud)
如果连接仍未建立,我会再次创建客户端并设置isConnected目录并连接到服务器。
后来,我只是对发生的事情感到好奇,并寻找一些有趣的东西:
http://jmesnil.net/stomp-websocket/doc/
创建 STOMP 客户端后,它必须调用其 connect() 方法来有效连接 STOMP 服务器并对其进行身份验证。
除了
但如果连接失败怎么办?connect() 方法接受一个可选的 error_callback 参数,如果客户端无法连接到服务器,将调用该参数。
还有来自stackoverflow的帖子,进一步证实了我的重构
我创建了一个新的 Stomp.Client 实例,因为当前实例的 Web 套接字已关闭,并且一旦关闭,就无法重新打开 Web 套接字。
| 归档时间: |
|
| 查看次数: |
7272 次 |
| 最近记录: |