2016-09-02 33 views
0

我想使用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); 
+2

webWorker中的代碼無法訪問主線程中的ANY變量,反之亦然。在你的問題中,我不能告訴代碼中哪些代碼位於主JS線程中,哪些代碼位於webWorker中,但不能在兩者之間共享變量。正如您已經知道的那樣,您可以在兩者之間發送消息,並且可以使用消息發送數據副本,但無法在兩者中訪問相同的變量。 – jfriend00

+1

我想補充一點,你也不能從你的worker中訪問任何DOM元素。就像jfriend00說的那樣,通信發生在主JS和工作人員之間的發送和接收消息上。你可以在你的消息中發佈本地JS對象。也只是香草JS,沒有Jquery或任何你可能與你的工作人員一起工作。 –

+1

我想我可能會把「本地對象」與更一般的東西混淆起來。我正在談論'var variables = {name:'abc',URL:'http:// .....'};' –

回答

0

如果您的套接字位於主線程中,則無法通過webWorker訪問它。這是web工作者的限制。您不能在主線程和WebWorker之間共享變量。由於併發問題,存在此限制。

你這裏的選擇是:

  1. 在webWorker創建的WebSocket所以socket變量在webWorker存在,並且可以在那裏使用。

  2. 當你想從webWorker發送數據到webSocket時,發送一條消息到主線程,數據作爲參數,要求它在webSocket上發送數據並讓主線程完成實際的發送。所以,所有在webSocket上發送的信息都會留在主線程中。

相關問題