首页 > 解决方案 > 非异步 javascript 函数竞争条件

问题描述

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

我怎么能等到jsmediatags.read真正完成才能返回。(它不是异步函数)。

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在实际设置之前使用它。

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

标签: javascriptnode.jsecmascript-6electron

解决方案


当然,你可以承诺它:

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

推荐阅读