我想使用socket.io將音頻緩衝區從JavaScript傳輸到燒錄服務器。但是當我想從音頻回調函數中使用它時,套接字實例是'未定義的'。爲什麼不能從JavaScript web worker訪問此套接字?
在此代碼中,我的主線程中的套接字實例是'套接字'。每次從麥克風收到新的緩衝區時,都會從工作人員調用「記錄」功能。
但socket.emit總是給我:
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
我該如何正確訪問套接字從工人中?
在主線程中,我有Socket對象和在postMessage的從網絡工作者調用的方法:
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})
}
在網絡工作者線程,postMessage的所稱的「記錄」的方法:
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);
webWorker中的代碼無法訪問主線程中的ANY變量,反之亦然。在你的問題中,我不能告訴代碼中哪些代碼位於主JS線程中,哪些代碼位於webWorker中,但不能在兩者之間共享變量。正如您已經知道的那樣,您可以在兩者之間發送消息,並且可以使用消息發送數據副本,但無法在兩者中訪問相同的變量。 – jfriend00
我想補充一點,你也不能從你的worker中訪問任何DOM元素。就像jfriend00說的那樣,通信發生在主JS和工作人員之間的發送和接收消息上。你可以在你的消息中發佈本地JS對象。也只是香草JS,沒有Jquery或任何你可能與你的工作人員一起工作。 –
我想我可能會把「本地對象」與更一般的東西混淆起來。我正在談論'var variables = {name:'abc',URL:'http:// .....'};' –