Как проверить, был ли добавлен конкретный модуль в рабочийлет?

Я работаю с 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. Есть ли другой способ, кромеtry-catching и маркировка наAudioContext объект?

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, если он уже был загружен ранее.

Другие вопросы по тегам