非异步javascript函数竞争条件



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

我怎么能等到jsmediatags.read实际完成返回。(它不是async函数)。

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

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

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

相关内容

  • 没有找到相关文章

最新更新