将数据从一个数组复制到另一个数组会导致结果数组仅包含输入数组中最后一项的重复条目

Copying data from one array to another causes the result array to consists only of repeating entries of the last item from the input array

我正在尝试编写一个异步函数,该函数从一个 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;
  }

输入: 实际输出: 期望的输出: 结果数组应包含输入数组中的所有 6 个项目。

你需要在地图上使用Promise.all,因为它return是一个承诺数组,你还需要return结果数组:

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 函数中的更改。

更新

您还应该将 return 类型 : Promise<MusicWithMetadata[]> 放在最后一个方法上:

private async getMusicArrayWithMetadata(musicList: Array<Music>): Promise<MusicWithMetadata[]>