为什么不能从JavaScript Web worker访问此套接字?

时间:2016-09-02 04:44:04

标签: javascript audio socket.io web-worker flask-socketio

我想使用socket.io将音频缓冲区从JavaScript流式传输到我的烧瓶服务器。但套接字实例未定义'当我想在音频回调函数中使用它时。

在这段代码中,主线程中的socket实例是' socket'。功能'记录'每次从麦克风收到新的缓冲区时,都会从工作人员调用。

但是socket.emit总是给我:

  

未捕获的ReferenceError:socket未定义记录@   斑点:http://localhost:7777/400a58bc-b64f-4c66-9bb1-65a28bf9bfba:39onmessage   @ blob:http://localhost:7777/400a58bc-b64f-4c66-9bb1-65a28bf9bfba:15

如何从工作人员中正确访问套接字?

在主线程中,我有来自web worker的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);

1 个答案:

答案 0 :(得分:0)

如果您的套接字位于主线程中,则无法从webWorker访问它。这是webWorkers的限制。您不能在主线程和webWorker之间共享变量。由于并发问题,存在此限制。

你在这里的选择是:

  1. 在webWorker中创建webSocket,因此socket变量存在于webWorker中,可以在那里使用。

  2. 如果要从webWorker中向webSocket发送数据,请将数据作为参数发送到主线程,要求它在webSocket上发送数据并让主线程执行实际发送。因此,webSocket上的所有发送都将保留在主线程中。

相关问题