我正在尝试编写一个异步函数,该函数从 Music 类型的数组中创建一个 MusicWithMetadata 类型的新数组。我已经用输入数组中的 6 个条目对其进行了测试。出于某种原因,结果数组仅包含输入数组最后一项的 6 个条目。
private async getMusicWithMetadata(music: Music): Promise<MusicWithMetadata> {
const metadata = await musicMedatada.parseFile(music.src);
const musicWithMetadata = NullMusicWithMetadata;
musicWithMetadata.id = music.id;
musicWithMetadata.src = music.src;
musicWithMetadata.src_type = music.src_type;
musicWithMetadata.title =
metadata.common.title !== undefined
? metadata.common.title
: this.getFileNameWithoutExtension(music.src);
musicWithMetadata.artists = metadata.common.artists;
musicWithMetadata.album = metadata.common.album;
musicWithMetadata.albumArt =
metadata.common.picture !== undefined
? `data:${
metadata.common.picture[0].format
};base64,${metadata.common.picture[0].data.toString('base64')}`
: metadata.common.picture;
return musicWithMetadata;
}
private async getMusicArrayWithMetadata(musicList: Array<Music>) {
const test1 = musicList.map(async (music) => {
const musicWithMetadata = await this.getMusicWithMetadata(music);
return Promise.resolve().then(() => {
console.log(musicWithMetadata);
return musicWithMetadata;
});
});
await Promise.all(test1).then((music) => {
console.log(music);
});
}
我在这里调用方法。
public async queueAll() {
const musicList = await this.musicRepository.getAll();
MusicManager.queue = await this.getMusicArrayWithMetadata(musicList);
MusicManager.currentlyPlayingPosition = 0;
}
您需要Promise.all
在地图上使用,因为它返回一个承诺数组,您还需要返回结果数组:
private async getMusicWithMetadata(music: Music): Promise<MusicWithMetadata> {
const metadata = await musicMedatada.parseFile(music.src);
return {
...music,
title: metadata.common.title !== undefined
? metadata.common.title
: this.getFileNameWithoutExtension(music.src),
artists: metadata.common.artists,
album: metadata.common.album,
albumArt: metadata.common.picture !== undefined
? `data:${
metadata.common.picture[0].format
};base64,${metadata.common.picture[0].data.toString('base64')}`
: metadata.common.picture,
};
}
private async getMusicArrayWithMetadata(musicList: Array<Music>) {
const test1 = await Promise.all(musicList.map(async (music) => {
const musicWithMetadata = await getMusicWithMetadata(music);
console.log(musicWithMetadata);
return musicWithMetadata;
}));
return test1;
}
我重构了getMusicWithMetadata
但你真正需要的是getMusicArrayWithMetadata
函数的变化。
更新
您还应该将返回类型: Promise<MusicWithMetadata[]>
放在最后一个方法上:
private async getMusicArrayWithMetadata(musicList: Array<Music>): Promise<MusicWithMetadata[]>
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句