如何从工作集内部访问全局/窗口范围? javascript前端

问题描述

我创建了一个 AudioWorkletProcessor 并像这样激活它:

audioCtx = new AudioContext();
await audioCtx.audioWorklet.addModule('testworklet.js');
mysource = new AudioWorkletNode(audioCtx,'testworklet');
mysource.connect(audioCtx.destination);

在 testworklet.js 中我定义

class TestWorklet extends AudioWorkletProcessor {    
    constructor(options){
        super(options);
        this.s = WebSocket('wss://localhost') // ERROR: WebSocket is undefined!
    }
    process(inputs,outputs) {
        return true;
    }
}

但是这段代码无法访问WebSocket,因为WebSocket在“window”作用域内,而代码运行在AudioWorkletGlobalScope下。

我如何使用 JavaScript?

解决方法

这是解决方案:您不需要。

documentation 进行更彻底的检查后发现了 port 属性:MessagePort 允许在处理器和工作集本身之间发送消息。由于处理器无法访问任何内容,因此我扩展了工作集以执行 i/o 工作并将数据发送到处理器。代码如下:

在工作集(主脚本)中,我可以访问所有内容。我获取数据并通过端口将其发送给工作人员

        class MyWorkletNode extends AudioWorkletNode{
            constructor(){
                super(audioCtx,'testprocessor');
                var p = this.port;
                socket.on('audio_data',function(msg){
                    p.postMessage(msg['data']);
                });
            }
        }
        audioCtx = new AudioContext();
        await audioCtx.audioWorklet.addModule('testprocessor.js');
        mysource = new AudioWorkletNode(audioCtx,'testprocessor');
        mysource.connect(audioCtx.destination);

在处理器中,我只是通过端口(而不是直接)从工作集接收数据:

      class TestProcessor extends AudioWorkletProcessor {    
          constructor(options){
            super();
            this.port.addEventListener('message',(event) => {
              this.ondata(event);
            } );
            this.port.start()
          }

注意:我把之前不准确的名字:testworklet.js 改成了 testprocessor.js