【问题标题】:How do I check if a specific module has been added to a Worklet?如何检查特定模块是否已添加到 Worklet?
【发布时间】:2020-08-13 04:05:19
【问题描述】:

我正在使用AudioWorkletNode,要使用它,您需要先在audio_context.audioWorklet 上加载一个处理器模块。

DOMException: Failed to construct 'AudioWorkletNode': AudioWorkletNode cannot be created: AudioWorklet does not have a valid AudioWorkletGlobalScope. Load a script via audioWorklet.addModule() first.

由于我的代码的模块化特性,我需要一种可靠的方法来防止处理器模块的不必要的多次加载;如果已经对给定的AudioContext 完成,则不要对.addModule。除了 try-catching 和在AudioContext 对象上标记之外,还有其他方法吗?

【问题讨论】:

    标签: javascript web-audio-api audio-worklet worklet


    【解决方案1】:

    假设您已将处理器命名为 my-processor,并且您的 AudioWorkletProcessor 的定义看起来像这样:

    class MyProcessor extends AudioWorkletProcessor {
    
        process () {
            return true;
        }
    
    }
    
    registerProcessor('my-processor', MyProcessor);
    

    要检查该处理器是否已经加载,您可以在主线程中执行以下操作:

    // somewhere inside of an async function ...
    
    let audioWorkletNode;
    
    try {
        audioWorkletNode = new AudioWorkletNode(audioContext, 'my-processor');
    } catch (err) {
        await audioContext.audioWorklet.addModule('./worklet.js');
    
        audioWorkletNode = new AudioWorkletNode(audioContext, 'my-processor');
    }
    

    代码使用了try/catch 块,但如果之前已经加载过,它至少不会加载 JS 文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-09
      • 2017-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多