Promise.all未按预期resolve promise,如何返回携带metadataPDA的结果
问题原因
Promise.all 只会等待传入数组中本身是Promise类型的元素执行完成。
你第一段代码中map返回的是axios.get()产生的Promise实例数组,Promise.all会正常等待所有请求完成,返回响应结果数组。
你第二段代码中map返回的是普通对象数组,Promise.all不会递归处理对象内部的Promise,所以直接返回了原对象,内部的axios.get请求没有被等待,自然处于pending状态。
修复方案
你需要让map返回的每一项都是Promise,该Promise在请求完成后resolve为你需要的、携带metadataPDA和已解析的metadataExternal的对象,写法如下:
const metadatasExternal = await Promise.all( NFTs.map(async n => ({ metadataPDA: n.metadataPDA, metadataExternal: await axios.get(n.metadataOnchain?.data.uri!), })) )
给map的回调加async关键字后,每次遍历都会返回一个Promise实例,Promise.all会等待所有Promise执行完成。每个Promise内部会先等待axios.get请求返回结果,再组装成你需要的对象返回,最终得到的数组里每个元素的metadataExternal都是已解析的响应结果,同时保留了metadataPDA字段可以做匹配。
内容的提问来源于stack exchange,提问作者ilmoi
相关产品推荐
相关产品推荐

