连接到websocket使webworker在微软边缘无响应

连接到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; 

     }; 
    }; 
+0

什么是'this'内'connect'事件处理程序? – guest271314

+0

我不确定你在哪里看到'this',但是如果你通常询问连接处理器内部的上下文是什么,它的处理器或窗口是什么。我不知道这是如何相关的。 –

+0

使用正确的上下文调用了“postMessage”吗?检查'data'的目的是什么?是'javascript'的一部分传递给消息的字符串?您是否尝试过在附加'message'事件处理函数后调用'worker.postMessage({type:'INIT_SOCKET'});'' – guest271314

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; 

     }; 
    } 
}; 

plnkr http://plnkr.co/edit/zVnLE6qG7Kf4yVSb0aJt?p=preview

+0

我提到的错误是非常奇怪的,因为它不一致,它只出现在每一个第二页刷新,只在边缘,并且只有当包含连接到套接字的线路时。不过,我会尽量更仔细地回答你的回答。如果需要的话,每次刷新页面时都会发生这个错误。 –

+0

@NetaMeta请注意,还没有尝试过边缘。无法重现特定问题。虽然'WebSocket'似乎在铬上返回预期的结果。可能会进一步调整和改进方法以满足要求。 – guest271314

+0

那么如果没有在边缘测试,那么你有错误的测试参数,你的解决方案是无效的。当发生这种情况也仅限于边缘,socket.io不是可选的。 –