1

我正在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.

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

4

1 回答 1

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 文件。

于 2020-04-29T19:34:38.177 回答