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