设置
我正在使用websockets/ws库来收听WSS Feed。效果很好,它足够轻巧,似乎是fastest around之一(,这很重要)。
我试图区分我以编程方式关闭连接,并且无论出于何种原因关闭它。
根据the docs,我可以发送code
(int)和reason
(字符串),这两个都发送到on close event。但从各方面来看,这个功能已不复存在。
测试
First argument must be a valid error code number
错误code = 1005
和空reason
发送给活动1005
代码,则会收到无效错误1000
,则该活动会收到code = 1006
且仍为空reason
(无论我放的是什么)^测试很简单......
var WebSocket = require('ws');
var ws = new WebSocket(url);
ws.on('close', function(code, reason) {
console.log(code);
console.log(reason);
});
var code = 1234,
reason = 'whatever reason';
setTimeout(function() {
ws.close(code, reason);
}, 5000);
可是...
我需要能够判断我是否已关闭连接,或者是否由于其他原因而关闭(连接丢失,由于时间限制而关闭它等)。根据它被关闭的原因,我有时需要立即重新打开连接,但只有有时。
我可以做点像......
_initWS(url) {
var ws = new WebSocket(url);
ws.on('open', function() {...});
ws.on('close', function(code, reason) {
ws = null; // Don't know if needed
ws = _initWS(url); // Reopen the connection, for ever and ever...
});
ws.on('message', funciton(msg) {...});
return ws;
}
var someFeed = _initWS(someURL);
...但由于code
和reason
几乎没有任何意义,因此无论关闭的原因如何,都会自动重新启动连接。如果连接丢失或超时,这很好,但如果我想以编程方式关闭它,那就太好了......
someFeed.close(); // Connection immediately reopens, always and forever
问题(S)
如何区分不同的关闭?我不想更改库代码,因为当我移动自己的代码时,我不能使用npm install
。我可以在自己的代码中覆盖close方法吗?
或者是否有一个同样轻量级且闪电般快速的库,它具有我正在寻找的功能?我只需要能够可靠地发送一个唯一的code
和/或reason
,所以我知道我何时尝试手动关闭它。我知道要求提供建议是禁忌,但是有太多的库可以测试每一个,而且没有我能找到的基准。
答案 0 :(得分:0)
来自@Bergi
的建议_initWS(url) {
var ws = new WebSocket(url);
ws.didIClose = false; // This is the flag to set if I close it manually
ws.forceClose = function() {
ws.didIClose = true;
ws.close();
};
ws.on('open', function() {...});
ws.on('close', function(code, reason) {
if(!ws.didIClose) { // If I didn't close it, reopen
ws = null;
ws = _initWS(url);
}
});
ws.on('message', funciton(msg) {...});
return ws;
}
var someFeed = _initWS(someURL);
然后使用它......
someFeed.didIClose = true;
someFeed.close(); // Won't reopen the connection
或者,有点清洁......
someFeed.forceClose();
编辑#1
修改后的解决方案包含forceClose()
方法 - 只需要一行代码就可以通过编程方式关闭它(而不是两行)。