如何在JavaScript中为带字符串标签的Promise数组使用Promise.all?
解决Promise.all保留标签的问题
首先你原代码里的Promise创建存在问题:new Promise(() => {this.repository.getRepository<a.entity>.find()})完全没必要手动包裹一层Promise——find()方法本身就会返回Promise,而且你这种写法没有正确resolve结果,会导致Promise永远无法完成。
要保留实体名称标签,正确的思路是让每个Promise完成后,返回**[实体名称, 查询结果]**的数组。这样用Promise.all处理后,就能直接得到你想要的结构。
修正后的代码如下:
// 构建Promise数组,每个Promise resolve后返回[实体名称, 查询结果] const promiseArray = array.map(a => { // 直接调用find()返回的Promise,通过then把结果和名称绑定 return this.repository.getRepository(a.entity).find() .then(result => [a.entityName, result] as [string, unknown[]]); }); // 用Promise.all处理,直接得到带标签的结果数组 try { const result = await Promise.all(promiseArray); console.log(result); // result结构正是你需要的:[['EntityName', [{},{}]], ['EntityName2', [{},{}]]] } catch (e) { console.error(e); }
为什么之前的方法无效?
- 直接把
[string, Promise]数组传给Promise.all:Promise.all会等待数组内每个元素,但字符串不是Promise,会直接resolve为原字符串,最终结果会是[['EntityName', Promise], ['EntityName2', Promise]],完全不符合预期。 - 用
promiseArray.map(pm => pm[1]):虽然能拿到所有Promise,但丢失了对应的实体名称,因为map后只剩下孤立的Promise数组,没有关联标签。
额外类型优化(可选)
如果需要更严谨的类型定义,可以给结果指定类型:
type EntityResult = [string, Record<string, unknown>[]]; const result: EntityResult[] = await Promise.all(promiseArray);
内容的提问来源于stack exchange,提问作者Mamochi
相关产品推荐
相关产品推荐

