【问题标题】:non-async javascript function race condition [duplicate]非异步javascript函数竞争条件[重复]
【发布时间】:2021-10-22 21:13:46
【问题描述】:

我正在使用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

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

【问题讨论】:

  • 坦率地说,我看不出有什么问题——你期望会发生什么,当然read 会立即返回——它返回并不是表示某些内容已被阅读,而是调用onSuccess(或错误时onError)表示这一点。你必须相应地设计你的代码。你现在明白控制台输出两行代码的原因了吗?
  • @amn 是否可以编写一个等待read 完成的函数?还是有一些我应该说服的替代设计。在我连载歌曲之前,我真的需要知道它已经完成。
  • 是的,有可能,请参阅提供的答案。

标签: javascript node.js ecmascript-6 electron


【解决方案1】:

当然,你可以承诺:

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

然后使用它,例如在带有awaitasync 函数中:

(async () => {
    const tag = await get_song(song_path, album);

    song.title = tag?.tags?.title;
})();

【讨论】:

【解决方案2】:
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;
    }
}

【讨论】:

    猜你喜欢
    • 2010-11-27
    • 2020-07-12
    • 2021-06-04
    • 1970-01-01
    • 1970-01-01
    • 2011-11-06
    • 2018-10-01
    • 2020-11-22
    • 2021-08-02
    相关资源
    最近更新 更多