Исправление проблемы нескольких одновременных попыток подключения по WebSocket

This commit is contained in:
Book Pauk
2020-10-30 16:02:09 +07:00
parent 5e8b2e1c87
commit ad32bdab44

View File

@@ -1,3 +1,5 @@
import * as utils from '../share/utils';
const cleanPeriod = 60*1000;//1 минута
class WebSocketConnection {
@@ -9,6 +11,8 @@ class WebSocketConnection {
this.messageQueue = [];
this.messageLifeTime = messageLifeTime;
this.requestId = 0;
this.connecting = false;
}
addListener(listener) {
@@ -53,14 +57,22 @@ class WebSocketConnection {
}
open(url) {
return new Promise((resolve, reject) => {
return new Promise((resolve, reject) => { (async() => {
//Ожидаем окончания процесса подключения, если open уже был вызван
let i = 0;
while (this.connecting && i < 200) {//10 сек
await utils.sleep(50);
i++;
}
if (i >= 200)
this.connecting = false;
//проверим подключение, и если нет, то подключимся заново
if (this.ws && this.ws.readyState == WebSocket.OPEN) {
resolve(this.ws);
} else {
let protocol = 'ws:';
if (window.location.protocol == 'https:') {
protocol = 'wss:'
}
this.connecting = true;
const protocol = (window.location.protocol == 'https:' ? 'wss:' : 'ws:');
url = url || `${protocol}//${window.location.host}/ws`;
@@ -72,10 +84,9 @@ console.log('new connection');
}
this.timer = setTimeout(() => { this.periodicClean(); }, cleanPeriod);
let resolved = false;
this.ws.onopen = (e) => {
console.log(this.ws.readyState);
resolved = true;
this.connecting = false;
resolve(e);
};
@@ -99,11 +110,13 @@ console.log(this.ws.readyState);
this.ws.onerror = (e) => {
this.emit(e.message, true);
if (!resolved)
if (this.connecting) {
this.connecting = false;
reject(e);
}
};
}
});
})() });
}
//timeout в минутах (cleanPeriod)