2016-12-22 23 views
12

तो यह अजीब है, जब मैं करने की कोशिश WebSocket से कनेक्ट (यह केवल एक Microsoft बढ़त मुद्दा है) यह हर दूसरे पृष्ठ पर ऐसा करता है ताज़ा webworker संदेशों को स्वीकार नहीं करेगा onMessage अभ्यस्त ट्रिगर बिल्कुल:माइक्रोसॉफ्ट बढ़त में WebWorker अन-उत्तरदायी बनाने WebSocket से कनेक्ट कर

निम्नलिखित पर विचार:

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

मुझे यकीन नहीं है कि आप 'यह' कहां देखते हैं, हालांकि यदि आप आमतौर पर कनेक्शन हैंडलर के अंदर संदर्भ क्या हैं, तो हैंडलर या विंडो। मुझे यकीन नहीं है कि यह कैसे प्रासंगिक है। –

+0

क्या 'पोस्टमेसेज' सही संदर्भ के साथ बुलाया जा रहा है? 'डेटा' की जांच के लिए उद्देश्य क्या है? क्या एक स्ट्रिंग 'जावास्क्रिप्ट' के एक हिस्से में संदेश के रूप में पास की गई है? क्या आपने 'worker.postMessage ({type: 'INIT_SOCKET'}) को कॉल करने का प्रयास किया है; 'संदेश' ईवेंट हैंडलर को जोड़ने के बाद? – guest271314

उत्तर

1

requireWorker संदर्भ में परिभाषित किया जा करने के लिए प्रकट नहीं होता। DedicatedWorkerGlobalScope में बाहरी स्क्रिप्ट आयात करने के लिए importScripts() का उपयोग करें। उदाहरण के लिए

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 स्कोप के भीतर परिभाषित करने में सक्षम था।

दृष्टिकोण 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 नोट, किनारे की कोशिश नहीं की है। विशिष्ट मुद्दे को पुन: उत्पन्न करने में सक्षम नहीं था। हालांकि 'वेबसाकेट' क्रोमियम पर अपेक्षित परिणाम लौटने के लिए दिखाई दिया। आवश्यकता को पूरा करने के लिए संभवतः आगे समायोजित और सुधार किया जा सकता है। – guest271314

+0

ठीक है अगर किनारे पर परीक्षण नहीं किया गया है तो आपके पास गलत परीक्षण पैरामीटर हैं और आपका समाधान शून्य है। क्योंकि यह केवल किनारे के लिए होता है, socket.io वैकल्पिक नहीं है। –

संबंधित मुद्दे