You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使Promise.all返回结果与utteranceId建立映射关联?

问题解决:保留Promise结果与utteranceId的映射关系

你的代码核心问题有两个:

  1. buildAudioFetchRequests里直接返回[key, useAuthenticatedFetch(...)],但useAuthenticatedFetch是异步操作,这里第二个元素是未resolved的Promise,不是请求结果;
  2. 中间的flatten、Object.fromEntries属于多余的绕弯操作,反而增加了复杂度。

直接按下面的方式修改,就能让Promise.all返回的结果和utteranceId一一对应:

修改后的完整代码

const getUtterancesAudio = async (
  utterances: { utteranceId: string, interviewId: string }[]
): Promise<{ id: string, audio: unknown }[]> => { // 明确返回带ID的结果结构
  const config = useRuntimeConfig();

  // 直接生成带id和url的对象数组,无需多余转换
  const utteranceTasks = utterances.map((u) => ({
    id: u.utteranceId,
    url: `${config.public.apiBase}/utterance/182bd8fe-f57d-4595-b8d7-649ff8ca6d62/interview/665a799a-883b-4b20-9460-3eee486516a8/audio`
  }));

  // 直接生成Promise并等待全部完成
  const getResults = await Promise.all(
    utteranceTasks.map(task => buildAudioFetchRequests(task.id, task.url))
  );

  return getResults;
};

const buildAudioFetchRequests = async (id: string, url: string): Promise<{ id: string, audio: unknown }> => {
  // 等待fetch请求完成后,将id与结果打包返回
  const audioData = await useAuthenticatedFetch(url, { initialCache: false });
  return { id, audio: audioData };
};

关键改动说明

  • 砍掉了多余的flatten、Object.fromEntries和createPromises函数,直接在主函数里生成并处理Promise,逻辑更直白;
  • buildAudioFetchRequests里必须等待useAuthenticatedFetch的异步结果,再把id和结果绑定返回(这里用对象结构可读性更强,你也可以换成[id, audioData]数组格式);
  • 明确了getUtterancesAudio的返回类型,后续使用时能直接拿到带ID的结构化数据。

这样处理后,Promise.all返回的数组里,每个元素都对应一个utterance的id和它的请求结果,完全保留了映射关系。

内容的提问来源于stack exchange,提问作者godhar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 17:46:08