Tu código debería funcionar bien. Acabas de tropezar con un error en Discourse.
loadScript() no establece el atributo async para los scripts que carga. Por lo tanto, por defecto es async="true" y eso altera tu orden de carga. Es una peculiaridad del navegador. Tienes que forzar async="false" para los scripts cargados con JS.
Los plugins son más pequeños, por lo que se cargan más rápido que el paquete principal, pero al ser async ya no respetan el orden de carga: esperan a que el paquete principal se cargue y ejecute antes de ejecutarse.
Probablemente pasó desapercibido porque loadScript no está anidado en ninguna parte del núcleo, hasta donde yo sé. Normalmente agruparías archivos que necesitan trabajar juntos. Así que, para responder a tu otra pregunta. No, no hay funciones de Discourse que manejen ese tipo de cosas.
Tu otro fragmento también debería funcionar. Para que sea un poco más fácil de leer, quizás intenta encadenarlos sin anidarlos.
// Esto va fuera del decorador
const PLUGINS = {
speed: "https://example.com/foo.js",
skipBack: "https://example.com/bar.js",
jumpForward: "https://example.com/baz.js"
};
// Luego haz tu trabajo dentro del decorador
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);
});
});