Estoy usando jsmediatags para analizar metadatos de archivos mp3. Esta función toma el título de un archivo. Lamentablemente, regresa antes de que se complete la devolución de llamada onSuccess . Esto es un problema porque después de esta función, los datos se serializan y envían ANTES de que se establezca el título de la canción.
¿Cómo puedo esperar hasta que jsmediatags.read esté realmente completo para regresar? (no es una función asíncrona).
const get_song = (song_path, album) => { const song = { title: null, }; jsmediatags.read(song_path, { onSuccess: function (tag) { song.title = tag?.tags?.title; console.info("set song fields", song.title); }, onError: function (error) {} }); console.info("return from get_song", song.title); return song; }Esto produce
"return from get_song null", "set song fields TITLE" Y luego uso song.title antes de que esté configurado.
¿Cómo puedo rediseñar mi código para que la serialización de la canción ocurra después de que se complete esta devolución de llamada?
Claro, puedes prometerlo:
const get_song = async (song_path, album) => new Promise((resolve, reject) => { jsmediatags.read(song_path, { onSuccess: resolve, onError: reject }); }); Y luego utilícelo, por ejemplo, en una función async con await :
(async () => { const tag = await get_song(song_path, album); song.title = tag?.tags?.title; })();const getSong = async songPath => { var tag = await new Promise((resolve, reject) => { new jsmediatags.Reader(songPath) .read({ onSuccess: (tag) => { console.log('Success!'); resolve(tag); }, onError: (error) => { console.log('Error'); reject(error); } }); }); return { title: tag?.tags?.title; } }