javascript - 非异步 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
在实际设置之前使用它。
如何重新设计我的代码,以便在此回调完成后进行歌曲的序列化。
解决方案
当然,你可以承诺它:
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;
})();
推荐阅读
- c++ - OpenGL中的QPainter中断坐标系
- android - 使用 Billing API 取消 Google Play 订阅?
- c++ - 返回指向向量中项目的指针(来自迭代器)
- sql-server - 用表本身的数据更新表的每一行
- javascript - 如何让元素在滚动时消失,隐藏但功能齐全的滚动条?
- loops - Ansible: filter a merged yaml file
- class - Having duplicate methods in association/composition relationship
- google-cloud-platform - 使用 SRV 记录指向子域
- java - 使用行终止符读取行的 Java Reader
- c# - CORS failing for POST in web api