2016-09-02 1 views
0

Ich möchte mithilfe von socket.io Audiopuffer von JavaScript auf meinen Flasher-Server streamen. Aber die Socket-Instanz ist 'undefiniert', wenn ich sie innerhalb der Audio-Callback-Funktion verwenden möchte.Warum kann nicht auf diesen Socket von JavaScript Web Worker zugegriffen werden?

In diesem Code ist meine Socket-Instanz im Hauptthread "Socket". Die Funktion 'record' wird vom Worker jedes Mal aufgerufen, wenn ein neuer Puffer vom Mikrofon empfangen wird.

Aber die socket.emit gibt mir immer:

Uncaught ReferenceError: socket is not definedrecord @ blob: http://localhost:7777/400a58bc-b64f-4c66-9bb1-65a28bf9bfba:39onmessage @ blob: http://localhost:7777/400a58bc-b64f-4c66-9bb1-65a28bf9bfba:15

Wie kann ich die Steckdose richtig aus dem Arbeiter zugreifen?

im Hauptthread, ich habe das Socket-Objekt, und die Methode, die in postmessage von dem web Arbeiter aufgerufen:

var socket = io.connect('http://' + document.domain + ':'+location.port); 
socket.on('connect', function() { 
    socket.emit('my event', {data: 'I\'m connected!'}); 
}); 

... 

function record(inputBuffer){ 
    var buf = inputBuffer[0] 
    ///////HERE THE socket CANNOT BE FOUND, WHY?? 
    socket.emit('audio event',{data : buf}) 
} 

Im Web Arbeiter-Thread Postmessage ruft die 'Record' Methode:

this.onmessage = function(e){ 
    switch(e.data.command){ 
    case 'record': 
     /////HERE THE 'record' FUNCTION IS CALLED IN THE MAIN THREAD 
     record(e.data.buffer); 
     break; 
    } 
}; 

... 

(function(window){ 

    var Recorder = function(source, cfg){ 
    this.context = source.context; 
    if(!this.context.createScriptProcessor){ 
     this.node = this.context.createJavaScriptNode(bufferLen, 2, 2); 
    } else { 
     this.node = this.context.createScriptProcessor(bufferLen, 2, 2); 
    } 
    var currCallback; 

    this.node.onaudioprocess = function(e){ 
     ////THIS IS THE CALLBACK FROM MICROPHONE HARDWARE 
     worker.postMessage({ 
     command: 'record', 
     buffer: [ 
      e.inputBuffer.getChannelData(0), 
      e.inputBuffer.getChannelData(1) 
     ] 
     }); 
    } 

    this.record = function(){ 
     recording = true; 
    } 

    worker.onmessage = function(e){ 
     var blob = e.data; 
     currCallback(blob); 
    } 

    window.Recorder = Recorder; 

})(window); 
+2

Code in einem webWorker hat keinen Zugriff auf irgendwelche Variablen aus dem Haupt-Thread oder umgekehrt. Ich kann in dem Code, den Sie in Ihrer Frage haben, nicht sagen, welcher Code in dem Haupt-JS-Thread ist und welcher Code in einem WebWorker ist, aber Sie können Variablen nicht zwischen den beiden teilen. Wie Sie bereits wissen, können Sie Nachrichten zwischen den beiden senden, und Sie können Kopien von Daten mit der Nachricht senden, aber Sie können nicht auf die gleiche Variable in beiden zugreifen. – jfriend00

+1

Ich möchte hinzufügen, dass Sie auf kein DOM-Element in Ihrem Worker zugreifen können. So wie Jfriend00 sagte, die Kommunikation geschieht vollständig über gesendete und empfangene Nachrichten zwischen Haupt-JS und Worker. Sie können jedoch native JS-Objekte in Ihren Nachrichten posten. Auch nur Vanille JS, keine Jquery oder irgendetwas, mit dem Sie in Ihrem Arbeiter arbeiten könnten. –

+1

Ich glaube, ich habe "native Objekt" mit etwas allgemeinerem verwechselt. Ich spreche über Dinge wie 'var Variablen = {Name: 'abc', URL: 'http: // .....'};' –

Antwort

0

Wenn sich Ihr Socket im Hauptthread befindet, können Sie nicht über den webWorker darauf zugreifen. Das ist eine Einschränkung von webWorkers. Sie können Variablen nicht zwischen Hauptthread und webWorker freigeben. Diese Einschränkung besteht aufgrund von Nebenläufigkeitsproblemen.

hier Ihre Auswahl wäre:

  1. die WebSocket im Webworker erstellen, so dass die socket Variable in dem WebWorker existieren und können dort verwendet werden.

  2. Wenn Sie Daten aus dem webWorker an den webSocket senden möchten, senden Sie eine Nachricht an den Hauptthread mit Daten als Argument und bitten Sie darum, die Daten auf dem webSocket zu senden und den eigentlichen Thread zu senden. Also würde alles, was auf dem webSocket gesendet wird, im Hauptthread bleiben.

Verwandte Themen