Ihr Code sollte einwandfrei funktionieren. Sie sind gerade auf einen Fehler in Discourse gestoßen.
loadScript() setzt das async-Attribut für die von ihm geladenen Skripte nicht. Daher ist es standardmäßig async="true", was Ihre Ladeordnung durcheinanderbringt. Das ist eine Eigenart des Browsers. Sie müssen async="false" für mit JS geladene Skripte erzwingen.
Plugins sind kleiner, daher laden sie schneller als das Hauptpaket, aber da sie async sind, respektieren sie die Ladeordnung nicht mehr – sie warten, bis das Hauptpaket geladen und ausgeführt wurde, bevor sie selbst ausgeführt werden.
Das ist wahrscheinlich unbemerkt geblieben, weil loadScript meines Wissens nirgendwo im Kern verschachtelt ist. Normalerweise würden Sie Dateien bündeln, die zusammenarbeiten müssen. Um Ihre andere Frage zu beantworten: Nein, es gibt keine Discourse-Funktionen, die diese Art von Dingen handhaben.
Ihr anderer Snippet sollte ebenfalls funktionieren. Um ihn etwas leichter lesbar zu machen, versuchen Sie vielleicht, sie zu verketten, anstatt sie zu verschachteln.
// Dies kommt außerhalb des Decorators
const PLUGINS = {
speed: "https://example.com/foo.js",
skipBack: "https://example.com/bar.js",
jumpForward: "https://example.com/baz.js"
};
// Dann erledigen Sie Ihre Arbeit innerhalb des Decorators
loadScript(MEDIA_ELEMENT_SRC)
.then(() => loadScript(PLUGINS.speed))
.then(() => loadScript(PLUGINS.skipBack))
.then(() => loadScript(PLUGINS.jumpForward))
.then(() => {
audioplayers.forEach(function (el) {
new MediaElementPlayer(el, MEDIA_ELEMENT_CONFIG);
});
});