Net*_*eta 12 javascript web-worker websocket
所以这很奇怪,当我尝试连接到websocket(这只是一个微软边缘问题)时,它会在每个第二页上刷新,webworker不会接受根本onMessage不会触发的消息:
考虑以下:
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');
}
});
Run Code Online (Sandbox Code Playgroud)
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;
};
};
Run Code Online (Sandbox Code Playgroud)
require似乎没有在Worker上下文中定义。用于importScripts()将外部脚本导入到DedicatedWorkerGlobalScope. 例如
importScripts("socket.io.js");
Run Code Online (Sandbox Code Playgroud)
无法确定如何停止io()轮询和获取错误的调用,可能是由于404错误
Run Code Online (Sandbox Code Playgroud)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()实现。虽然能够在范围Socket内定义对象Worker。
使用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'
});
Run Code Online (Sandbox Code Playgroud)
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;
};
}
};
Run Code Online (Sandbox Code Playgroud)
plnkr http://plnkr.co/edit/zVnLE6qG7Kf4yVSb0aJt?p=preview