如何使Promise.all返回结果与utteranceId建立映射关联?
问题解决:保留Promise结果与utteranceId的映射关系
你的代码核心问题有两个:
buildAudioFetchRequests里直接返回[key, useAuthenticatedFetch(...)],但useAuthenticatedFetch是异步操作,这里第二个元素是未resolved的Promise,不是请求结果;- 中间的
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
相关产品推荐
相关产品推荐

