non-async javascript 函数竞争条件

non-async javascript function race condition

我正在使用 jsmediatags 解析 mp3 文件中的元数据。此函数从文件中获取标题。遗憾的是,在 onSuccess 回调完成之前 returns。这是一个问题,因为在此函数之后,数据被序列化并在设置 song.title 之前发送。

我怎么能等到 jsmediatags.read 实际上完成到 return。 (它不是异步函数)。

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;
}

这输出

"return from get_song null",
"set song fields TITLE"

然后我在实际设置之前使用song.title

如何重新设计我的代码,以便在此回调完成后进行歌曲的序列化。

当然,你可以承诺:

const get_song = async (song_path, album) => new Promise((resolve, reject) => {
    jsmediatags.read(song_path, {
        onSuccess: resolve,
        onError: reject
    });
});

然后使用它,例如在 async 函数中使用 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;
    }
}