连接到websocket使webworker在微软边缘无响应
所以这很奇怪,当我试图连接到websocket(这只是一个微软边缘问题)它使得每隔一秒刷新一次webworker
不会接受消息onMessage
不会触发可言:连接到websocket使webworker在微软边缘无响应
考虑以下几点:
main.js
var worker = new Worker("webworker.js");
worker.postMessage({ type: 'INIT_SOCKET' });
worker.addEventListener('message', (event) => {
let data = event.data;
if (typeof data === 'string') {
data = JSON.parse(data);
}
if (data.type === 'SOCKET_INITIALIZED') {
console.log('inititalized');
}
});
个webworker.js
var io = require('socket.io-client');
var socket;
onmessage = function(event) {
var data = event.data;
console.log('got a event');
if (typeof data === 'string') {
data = JSON.parse(data);
}
switch (data.type) {
case 'INIT_SOCKET':
try {
socket = io('xxxx', { transports: [ 'websocket' ], secure: true }); // this line causes the error
socket.on('connect', function() {
postMessage({
type: Consts.SOCKET_INITIALIZED
});
});
} catch(e) {
console.log('some error ', e);
}
break;
};
};
require
不会出现在Worker
上下文中定义。使用importScripts()
将外部脚本导入DedicatedWorkerGlobalScope
。例如
importScripts("socket.io.js");
无法确定如何从投票和收到错误停止io()
电话,可能是由于404
错误
socket.io.js:7370 WebSocket connection to 'ws://echo.websocket.org/socket.io/?EIO=3&transport=websocket' failed: Error during WebSocket handshake: Unexpected response code: 404
可能是由于是陌生的,在这里,至于如何io()
已实施。虽然能够在Worker
范围内定义Socket
对象。使用WebSocket
返回
方法预期的结果
const worker = new Worker("webworker.js");
worker.addEventListener('message', (event) => {
let data = event.data;
if (typeof data === 'string') {
console.log(data)
}
if (data.type === 'SOCKET_INITIALIZED') {
console.log('inititalized');
}
});
worker.postMessage({
type: 'INIT_SOCKET'
});
importScripts("socket.io.js");
let sock = io();
console.log(sock); // to demonstrate `Socket` is defined
sock.close(); // closing socket here to prevent `404` polling errors
self.socket = void 0;
self.onmessage = function(event) {
var data = event.data;
console.log('got a event');
if (typeof data === 'string') {
data = JSON.parse(data);
}
switch (data.type) {
case 'INIT_SOCKET':
if (!self.socket) {
try {
self.socket = new WebSocket("ws://echo.websocket.org/");
self.socket.onopen = function(e) {
socket.send("WebSocket rocks");
console.log("self.socket event.type:", e.type);
self.postMessage({
type: 'SOCKET_INITIALIZED'
});
};
self.socket.onmessage = function(e) {
console.log(e.data);
self.socket.close()
};
self.socket.onerror = function(e) {
console.log("self.socket error", e);
};
self.socket.onclose = function(e) {
console.log("self.socket event.type", e.type);
};
} catch (e) {
console.log('some error ', e);
}
break;
};
}
};
我提到的错误是非常奇怪的,因为它不一致,它只出现在每一个第二页刷新,只在边缘,并且只有当包含连接到套接字的线路时。不过,我会尽量更仔细地回答你的回答。如果需要的话,每次刷新页面时都会发生这个错误。 –
@NetaMeta请注意,还没有尝试过边缘。无法重现特定问题。虽然'WebSocket'似乎在铬上返回预期的结果。可能会进一步调整和改进方法以满足要求。 – guest271314
那么如果没有在边缘测试,那么你有错误的测试参数,你的解决方案是无效的。当发生这种情况也仅限于边缘,socket.io不是可选的。 –
什么是'this'内'connect'事件处理程序? – guest271314
我不确定你在哪里看到'this',但是如果你通常询问连接处理器内部的上下文是什么,它的处理器或窗口是什么。我不知道这是如何相关的。 –
使用正确的上下文调用了“postMessage”吗?检查'data'的目的是什么?是'javascript'的一部分传递给消息的字符串?您是否尝试过在附加'message'事件处理函数后调用'worker.postMessage({type:'INIT_SOCKET'});'' – guest271314