Как проверить, был ли добавлен конкретный модуль в рабочийлет?
Я работаю с 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
-catch
ing и маркировка на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, если он уже был загружен ранее.