2016-12-22 32 views
12

To jest dziwne, kiedy próbuję połączyć się z websocket (to jest tylko problem krawędzi Microsoft) sprawia, że ​​tak na co sekundę odświeżania strony webworker nie będzie akceptować wiadomości onMessage przyzwyczajenie spust w ogóle:połączenie z websocket sprawiają, że webworker nie odpowiada w Microsoft edge

rozważyć następujące kwestie:

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

Co jest '' connect' this' wewnątrz obsługi zdarzenia? – guest271314

+0

Nie jestem pewien, gdzie widzisz "ten", ale jeśli zazwyczaj pytasz, jaki jest kontekst wewnątrz programu obsługi połączenia, jego obsługi lub okna. nie jestem pewien, jak to jest istotne. –

+0

Czy wywołanie funkcji 'postMessage' jest poprawne? Jaki jest cel sprawdzenia "danych"? Czy ciąg znaków przekazuje się jako wiadomość w części 'javascript'? Czy próbowałeś wywoływać 'worker.postMessage ({type: 'INIT_SOCKET'});' po dołączeniu obsługi zdarzeń 'message'? – guest271314

Odpowiedz

1

require nie wydaje się być zdefiniowane na Worker kontekście. Użyj importScripts(), aby zaimportować zewnętrzne skrypty do DedicatedWorkerGlobalScope. Na przykład

importScripts("socket.io.js"); 

Nie można określić, jak zatrzymać io() połączenia z odpytywania i uzyskiwanie błąd, prawdopodobnie ze względu na 404 błędu

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 

prawdopodobnie spowodowane jest nieznane, tutaj, w jaki sposób io() jest zaimplementowany. Chociaż był w stanie zdefiniować obiekt Socket w zasięgu Worker.

Podejście za pomocą WebSocket powraca oczekiwany wynik

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

Błąd, o którym wspomniałem, jest bardzo dziwny, ponieważ nie jest spójny, pojawia się tylko przy odświeżaniu co drugiej strony, tylko na krawędziach i tylko wtedy, gdy dołączono linię do połączenia z gniazdem. jednak spróbuję twoją odpowiedź bardziej ostrożnie. również w razie potrzeby pojawił się błąd, który wystąpiłby przy każdym odświeżeniu strony. –

+0

@NetaMeta Uwaga, nie próbowałem krawędzi. Nie udało się odtworzyć określonego problemu. Wygląda na to, że 'WebSocket' zwrócił oczekiwany wynik na chromium. Możliwe byłoby dalsze dostosowanie i udoskonalenie podejścia w celu spełnienia wymagań. – guest271314

+0

Cóż, jeśli nie testowane na krawędzi, to masz błędne parametry testowe i twoje rozwiązanie jest nieważne. jak to występuje Tylko dla krawędzi również, socket.io nie jest opcjonalne. –