2016-12-22 66 views
12

所以這很奇怪,當我試圖連接到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

回答

1

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不是可選的。 –