连接到websocket使得webworker在Microsoft边缘无响应

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)

gue*_*314 1

require似乎没有在Worker上下文中定义。用于importScripts()将外部脚本导入到DedicatedWorkerGlobalScope. 例如

importScripts("socket.io.js"); 
Run Code Online (Sandbox Code Playgroud)

无法确定如何停止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
Run Code Online (Sandbox Code Playgroud)

可能是因为不熟悉这里如何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