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);
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
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. –
Ich glaube, ich habe "native Objekt" mit etwas allgemeinerem verwechselt. Ich spreche über Dinge wie 'var Variablen = {Name: 'abc', URL: 'http: // .....'};' –